Go言語で文字列の変換(全角・半角、ひらがな・カタカナ)をする

strings パッケージの ToUpperSpecialToLowerSpecial を使って、文字列の全角・半角、ひらがな・カタカナ変換を行ってみる。

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
}

CaseRangeLo, Hi, Delta の3つのフィールドを持つ構造体。

Lo から Hi までの Unicode コードポイントの文字に対して Delta の値を加えて文字を変換する。

type d [MaxCase]rune

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

参考サイト

コメント

この記事へのコメントはまだありません。

Top