😀

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

に公開

概要

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


// Reverse関数は文字列中の半角と全角を反転させた文字列を返します
func Reverse(string) string

使い方

H2z関数

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

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) // ァィゥェォッャュョ.
}

Reverse関数

Reverse関数は文字列中の半角と全角を反転させた文字列を返します。

package main

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

func main() {
    result := zhconv.Reverse("abc xyz!")
    fmt.Println(result) // abc xyz!

    result = zhconv.Reverse("012345")
    fmt.Println(result) // 012345

    result = zhconv.Reverse("Hello World! 123 アイウガパ")
    fmt.Println(result) // Hello World! 123 アイウガパ

    result = zhconv.Reverse("AbcDEFgh 123XYz アイウエオ カギクゲコ サジスゼソ タチヅテド")
    fmt.Println(result) //AbcDEFgh 123XYz アイウエオ カギクゲコ サジスゼソ タチヅテド

    result = zhconv.Reverse("1st「PRICE」is ¥1,000- (TAX IN) ガンバレ!")
    fmt.Println(result) // 1st「PRICE」is \\1,000- (TAX IN) ガンバレ!

    result = zhconv.Reverse("テストガ")
    fmt.Println(result) // テストガ

Discussion