0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Go] 高速な全角半角相互変換だ!!!!

Posted at

概要

Go言語で全角と半角を相互変換するライブラリを作りました。
一括変換だけでなく部分変換もできるようにしました。

変換には内部で変換用のmapを使って実装しています。
GoのmapはO1(オーダ1)なので高速な変換が期待できます。

Denoバージョンもあります!
https://github.com/suwakei/deno-zhconv
記事もあります!
https://zenn.dev/keitosuwahara/articles/615ba85bb6c65b

ぜひREADME代わりに当記事を読んでみてください!

インストール

go get -u github.com/suwakei/go-zhconv/zhconv

機能

// H2zは、文字列中の半角文字を全角文字に変換した文字列を返します。
// ASCII,カタカナ,数字,濁点/半濁点付きカタカナを扱います。
func H2z(string) string


// H2zAtは半角から全角に変換した文字列を返します。
// 変換文字列は第2引数で選択できます。
func H2zAt(string, ...int) string


// Z2hは、文字列中の全角文字を半角文字に変換した文字列を返します。
// ASCII,カタカナ,数字,濁点/半濁点付きカタカナを扱います
func Z2h(string) string


// Z2hAtは全角から半角に変換した文字列を返します。
// 変換文字列は第2引数で選択できます。
func Z2hAt(string, ...int) string

使い方

H2zは、文字列中の半角文字を全角文字に変換した文字列を返します。
ASCII,カタカナ,数字,濁点/半濁点付きカタカナを扱います。

H2z関数

package main

import (
    "fmt"
    "github.com/suwakei/go-zhconv/zhconv"
)

func main() {
	result = zhconv.H2z("Hello, world!")
	fmt.Println(result) // Hello, world!.

	result = zhconv.H2z("") // Empty string.
	fmt.Println(result) // "".

	result = zhconv.H2z("ABC123アイウガパ") // No conversion needed (Zenkaku).
	fmt.Println(result) // ABC123アイウガパ.

	result = zhconv.H2z("ABCdef XYZ!#$%&'()*+,-./:;<=>?@[¥]^_`{|}~ \\")
	fmt.Println(result) // ABCdef XYZ!#$%&’()*+,-./:;<=>?@[¥]^_‘{|}~ \.

	result = zhconv.H2z("0123456789") // Hankaku Digits to Zenkaku.
	fmt.Println(result) // 0123456789.

	result = zhconv.H2z("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン") // Hankaku Katakana to Zenkaku.
	fmt.Println(result) // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン.

	result = zhconv.H2z("ァィゥェォッャュョ") // Hankaku Katakana (Small) to Zenkaku.
	fmt.Println(result) // ァィゥェォッャュョ.

	result = zhconv.H2z("。、・ー「」")// Hankaku Katakana (Symbols) to Zenkaku.
	fmt.Println(result) // 。、・ー「」.

	result = zhconv.H2z("ガギグゲゴザジズゼゾダヂヅデドバビブベボヴ") // Hankaku Katakana with Dakuten to Zenkaku".
	fmt.Println(result) // ガギグゲゴザジズゼゾダヂヅデドバビブベボヴ.

	result = zhconv.H2z( "パピプペポ") // Hankaku Katakana with Handakuten to Zenkaku.
	fmt.Println(result) // パピプペポ.

	result = zhconv.H2z("これはテストです。123 ABC アイウ ガギグ パピプ!") // Mixed Hankaku/Zenkaku/Other.
	fmt.Println(result) // これはテストです。123 ABC アイウ ガギグ パピプ!.

	result = zhconv.H2z(" スペース ") // convert from Half width space to Full width space.
	fmt.Println(result) //   スペース .

	result = zhconv.H2z("ア゙イ゚ン゙") // Dakuten/Handakuten cannot be applied.
	fmt.Println(result) // ア゛イ゜ン゛ Converted to full-width characters as separated( (ア->ア, ゙->゙).

	result = zhconv.H2z("①②③㈱㈲") // Not convertible symbols.
	fmt.Println(result) // It is assumed that environment dependent characters will not be converted.

	result = zhconv.H2z("1バイト文字と2バイト文字が混在するテキスト。 ABC 123 ガギグパピプ!?") // Long string with various conversions.
	fmt.Println(result) // 1バイト文字と2バイト文字が混在するテキスト。 ABC 123 ガギグパピプ!?.
}

Z2h関数

Z2hは、文字列中の全角文字を半角文字に変換した文字列を返します。
ASCII,カタカナ,数字,濁点/半濁点付きカタカナを扱います

package main

import (
    "fmt"
    "github.com/suwakei/go-zhconv/zhconv"
)

func main() {
    result := zhconv.Z2h("Hello, world!")
    fmt.Println(result) // "Hello, world!"

    result = zhconv.Z2h("ABCdef XYZ!#$%&’()*+,-./:;<=>?@[¥]^_‘{|}~")
    fmt.Println(result) // ABCdef XYZ!#$%&'()*+,-./:;<=>?@[¥]^_`{|}~

    result = zhconv.Z2h("0123456789")
    fmt.Println(result) // 0123456789

    result = zhconv.Z2h("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン")
    fmt.Println(result) // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン

	result = zhconv.Z2h("ァィゥェォッャュョ")
    fmt.Println(result) // ァィゥェォッャュョ ヮ is not converted because there is no corresponding character for half-width.

    result = zhconv.Z2h("。、・ー「」")
    fmt.Println(result) // 。、・ー「」

    result = zhconv.Z2h("ガギグゲゴザジズゼゾダヂヅデドバビブベボヴ")
    fmt.Println(result) // ガギグゲゴザジズゼゾダヂヅデドバビブベボヴ

    result = zhconv.Z2h("パピプペポ")
    fmt.Println(result) // パピプペポ

    result = zhconv.Z2h(" スペース ") // convert from Full width space to half width space
    fmt.Println(result) //  スペース 

    result = zhconv.Z2h("①②③㈱㈲") // It is assumed that environment dependent characters will not be converted.
    fmt.Println(result) // ①②③㈱㈲
}

H2zAt関数

H2zAtは半角から全角に変換した文字列を返します。
変換文字列は第2引数で選択できます。

package main

import (
    "fmt"
    "github.com/suwakei/go-zhconv/zhconv"
)

func main() {
	result = zhconv.H2zAt("Hello, world!", 0, 7)
	fmt.Println(result) // Hello, world!.

	result = zhconv.H2zAt("", 0) // Empty string.
	fmt.Println(result) // "".

	result = zhconv.H2zAt("ABC123アイウガパ", 0, 5) // No conversion needed (Zenkaku).
	fmt.Println(result) // ABC123アイウガパ.

	result = zhconv.H2zAt("ABCdef XYZ!#$%&'()*+,-./:;<=>?@[¥]^_`{|}~ \\", 3, 17)
	fmt.Println(result) // ABCdef XYZ!#$%&'()*+,-./:;<=>?@[¥]^_`{|}~ \\.

	result = zhconv.H2zAt("0123456789",0, 5) // Hankaku Digits to Zenkaku.
	fmt.Println(result) // 0123456789.

	result = zhconv.H2zAt("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン", 0) // Hankaku Katakana to Zenkaku.
	fmt.Println(result) // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン.

	result = zhconv.H2zAt("ァィゥェォッャュョ", 0) // Hankaku Katakana (Small) to Zenkaku.
	fmt.Println(result) // ァィゥェォッャュョ.

Z2hAt関数

Z2hAtは全角から半角に変換した文字列を返します。
変換文字列は第2引数で選択できます。

package main

import (
    "fmt"
    "github.com/suwakei/go-zhconv/zhconv"
)

func main() {
    result := zhconv.Z2hAt("Hello, world!", 0, 7)
    fmt.Println(result) // Hello, world!.

    result = zhconv.Z2hAt("ABCdef XYZ!#$%&’()*+,-./:;<=>?@[¥]^_‘{|}~", 3, 17)
    fmt.Println(result) // ABCdef XYZ!#$%&’()*+,-./:;<=>?@[¥]^_‘{|}~.

    result = zhconv.Z2hAt("0123456789", 0, 5)
    fmt.Println(result) // 0123456789.

    result = zhconv.Z2hAt("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン", 0, 6, 9, 10)
    fmt.Println(result) // アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン.

	result = zhconv.Z2hAt("ァィゥェォッャュョ", 4)
    fmt.Println(result) // ァィゥェォッャュョ.
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?