読者です 読者をやめる 読者になる 読者になる

メモ:golangでひらがなをカタカナに変換する

golang Go言語 備忘

備忘メモ.こちらを参考にさせていただきました.(というかそのままなので,元記事をあたってください)

www.serendip.ws

CaseRange で変換する元の範囲と,変換先の範囲を書いておきます. 下の例では U+3041 (ぁ) から U+3093(ん) までの範囲を U+3041 以降の範囲にマッピングします. マッピングするためには U+3014 から U+3093 までの範囲の値に 0x30a1 から 0x3041 を引いた差分を足してやればいいので, 差分を Delta として登録します.Delta の登録先は 3つあって,UpperCase と LowerCase と TitleCase という風になっていて, それぞれ strings.ToUpperCasestrings.ToLowerCasestrings.ToTitleCase に対応しています.

// Indices into the Delta arrays inside CaseRanges for case mapping.
const (
    UpperCase = iota
    LowerCase
    TitleCase
    MaxCase

type d [MaxCase]rune // to make the CaseRanges text shorter  // ← これが Delta の型

ちょっと余談ですが,MaxCase の定義,iota で 0 で初めて,MaxCase で最大値にして,それを配列のサイズにする ってコードが書かれてるんですが,なんてエレガントなコードなんだろうと感嘆しました.

で,これが変換するサンプル.

package main

import (
    "fmt"
    "unicode"
    "strings"
)

var kanaConv = unicode.SpecialCase{
    unicode.CaseRange{
        Lo: 0x3041, // ぁ
        Hi: 0x3093, // ん
        Delta: [unicode.MaxCase]rune{
            0x30a1 - 0x3041, // strings.ToUpperCase でカタカナに変換されるマッピング
            0, // strings.ToLowerCase に対応 (今回は使わないことにして 0 を書いておく)
            0, // strings.ToTitleCase に対応 (今回は使わないことにして 0 を書いておく)
        },
    },
}

func main() {
    fmt.Println(strings.ToUpperSpecial(kanaConv, "あぃうえお ぃぃぃぃぃ")) // こっちは差分に従って変換される
    fmt.Println(strings.ToLowerSpecial(kanaConv, "あぃうえお ぃぃぃぃぃ")) // こっちは差分0だから変換されない
}
アィウエオ ィィィィィ
あぃうえお ぃぃぃぃぃ