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, "あいうえおわゐゑをんアイウエオワヰヱヲン"))
// => アイウエオワヰヱヲンアイウエオワヰヱヲン