Go言語で文字列の変換(全角・半角、ひらがな・カタカナ)をする
2015年04月13日
strings
パッケージの ToUpperSpecial
、ToLowerSpecial
を使って、文字列の全角・半角、ひらがな・カタカナ変換を行ってみる。
strings.ToUpperSpecial(_case unicode.SpecialCase, s string) string strings.ToLowerSpecial(_case unicode.SpecialCase, s string) string
SpecialCase
の定義に従って文字列を「大文字・小文字」に変換する。
type SpecialCase []CaseRange
SpecialCase
は、CaseRange
型のスライスで、言語毎(トルコ語など)に規定されているマッピングを表わす。
type CaseRange struct { Lo uint32 Hi uint32 Delta d }
CaseRange
は Lo
, Hi
, Delta
の3つのフィールドを持つ構造体。
Lo
から Hi
までの Unicode コードポイントの文字に対して Delta
の値を加えて文字を変換する。
type d [MaxCase]rune
Delta
は rune
型の長さ3(MaxCase
)の配列。
const ( UpperCase = iota LowerCase TitleCase MaxCase )
UpperCase
, LowerCase
, TitleCase
のそれぞれの場合に応じた値を Unicode コードポイントに加えることで、文字を変換する
与える値が 0 の場合は変換は行われない
数字を全角・半角に変換するサンプル
numConv := unicode.SpecialCase{ // 半角の 0 から 9 に対する変換ルール unicode.CaseRange{ 0x0030, // Lo: 半角の 0 0x0039, // Hi: 半角の 9 [unicode.MaxCase]rune{ 0xff10 - 0x0030, // UpperCase で全角に変換 0, // LowerCase では変換しない 0xff10 - 0x0030, // TitleCase で全角に変換 }, }, // 全角の 0 から 9 に対する変換ルール unicode.CaseRange{ 0xff10, // Lo: 全角の 0 0xFF19, // Hi: 全角の 9 [unicode.MaxCase]rune{ 0, // UpperCase では変換しない 0x0030 - 0xff10, // LowerCase で半角に変換 0, // TitleCase では変換しない }, }, } fmt.Println(strings.ToUpperSpecial(numConv, "1234567890abc123456789abc")) // => 1234567890ABC123456789ABC fmt.Println(strings.ToLowerSpecial(numConv, "1234567890abc123456789abc")) // => 1234567890abc123456789abc fmt.Println(strings.ToTitleSpecial(numConv, "1234567890abc123456789abc")) // => 1234567890ABC123456789ABC
ひらがな・カタカナの変換を行うサンプル
kanaConv := unicode.SpecialCase{ // ひらがなをカタカナに変換 unicode.CaseRange{ 0x3041, // Lo: ぁ 0x3093, // Hi: ん [unicode.MaxCase]rune{ 0x30a1 - 0x3041, // UpperCase でカタカナに変換 0, // LowerCase では変換しない 0x30a1 - 0x3041, // TitleCase でカタカナに変換 }, }, // カタカナをひらがなに変換 unicode.CaseRange{ 0x30a1, // Lo: ァ 0x30f3, // Hi: ン [unicode.MaxCase]rune{ 0, // UpperCase では変換しない 0x3041 - 0x30a1, // LowerCase でひらがなに変換 0, // TitleCase では変換しない }, }, } fmt.Println(strings.ToUpperSpecial(kanaConv, "あいうえおわゐゑをんアイウエオワヰヱヲン")) // => アイウエオワヰヱヲンアイウエオワヰヱヲン fmt.Println(strings.ToLowerSpecial(kanaConv, "あいうえおわゐゑをんアイウエオワヰヱヲン")) // => あいうえおわゐゑをんあいうえおわゐゑをん fmt.Println(strings.ToTitleSpecial(kanaConv, "あいうえおわゐゑをんアイウエオワヰヱヲン")) // => アイウエオワヰヱヲンアイウエオワヰヱヲン