go 漢字長(zhǎng)度及全角轉(zhuǎn)半角

漢字

在 Golang 中,如果字符串中出現(xiàn)中文字符不能直接調(diào)用 len 函數(shù)來(lái)統(tǒng)計(jì)字符串字符長(zhǎng)度,這是因?yàn)樵?Go 中,字符串是以 UTF-8 為格式進(jìn)行存儲(chǔ)的,在字符串上調(diào)用 len 函數(shù),取得的是字符串包含的 byte 的個(gè)數(shù)。
每個(gè)中文字,占3個(gè)byte。英文字符,占一個(gè)byte。

str1 := "你好啊H" 
fmt.Println(len(str1)) // 打印結(jié)果:10
func TestFunc2(t *testing.T) {
    const nihongo = "你好呀"
    for index, runeValue := range nihongo {
        fmt.Printf("%#U starts at byte position %d\n", runeValue, index)
    }

    //%#U,這個(gè)格式,即打印Unicode
    //U+4F60 '你' starts at byte position 0
    //U+597D '好' starts at byte position 3
    //U+5440 '呀' starts at byte position 6
}

如何計(jì)算漢字的長(zhǎng)度呢?

func TestFunc2(t *testing.T) {
    const nihongo = "你好呀"
    for index, runeValue := range nihongo {
        fmt.Printf("%#U starts at byte position %d\n", runeValue, index)
    }

    //%#U,這個(gè)格式,即打印Unicode
    //U+4F60 '你' starts at byte position 0
    //U+597D '好' starts at byte position 3
    //U+5440 '呀' starts at byte position 6

    fmt.Printf("長(zhǎng)度:=%d \n", utf8.RuneCountInString(nihongo))

    //  或者
    fmt.Printf("長(zhǎng)度:=%d \n", len([]rune(nihongo)))
}

ASCII 字符串長(zhǎng)度使用 len() 函數(shù)。
Unicode 字符串長(zhǎng)度使用 utf8.RuneCountInString() 函數(shù)。

全角字符串轉(zhuǎn)換半角字符串

// 全角字符串轉(zhuǎn)換半角字符串
// 參數(shù):
//      str:字符串
// 返回:
//      轉(zhuǎn)換半角后的字符串
func FullWidthStrToHalfWidthStr(str string) (result string) {
    for _, charCode := range str {
        inside_code := charCode
        if inside_code == 12288 {
            inside_code = 32
        } else {
            inside_code -= 65248
        }

        if inside_code < 32 || inside_code > 126 {
            result += string(charCode)
        } else {
            result += string(inside_code)
        }
    }

    return result
}

全角字符從unicode編碼從65281~65374
半角字符從unicode編碼從 33~126
空格比較特殊,全角為 12288,半角為 32
而且除空格外,全角/半角按unicode編碼排序在順序上是對(duì)應(yīng)的
所以可以直接通過(guò)用+-法來(lái)處理非空格數(shù)據(jù),對(duì)空格單獨(dú)處理
全角指的是一個(gè)字符占2個(gè)標(biāo)準(zhǔn)字符的位置(例如中國(guó)漢字)。
半角指的是占1個(gè)標(biāo)準(zhǔn)字符的位置(例如普通的字符a)。ASCII以內(nèi)的就叫半角符號(hào),以外的就叫全角符號(hào)。
注意:
并不是所有的全角字符都能被轉(zhuǎn)換為半角字符,例如漢字是全角字符,占2個(gè)字符的位置,但它無(wú)法被轉(zhuǎn)換;只有英文字母、數(shù)字鍵、符號(hào)鍵等才能可以做全角和半角之間的轉(zhuǎn)換。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 序言 程序前臺(tái)頁(yè)面中,經(jīng)常有一些有輸入長(zhǎng)度限制的input和textarea,限制長(zhǎng)度的方法有標(biāo)簽上加入maxle...
    看看你的肥臉閱讀 1,033評(píng)論 0 0
  • 相信大家都對(duì)全角半角的概念已經(jīng)有所了解了。中文文字永遠(yuǎn)是全角,只有英文字母、數(shù)字鍵、符號(hào)鍵才有全角半角的概念,一個(gè)...
    Ray0458閱讀 7,802評(píng)論 1 0
  • 只要有中文的地方就會(huì)有編碼問(wèn)題...... 編碼問(wèn)題是學(xué)習(xí)編程中非常重要的一個(gè)問(wèn)題,如果對(duì)編碼和字符集不能透徹理解...
    Steven王老師閱讀 1,007評(píng)論 0 0
  • 早上發(fā)現(xiàn)某個(gè)群居然爆出一個(gè)bug,上游系統(tǒng)存儲(chǔ)的客戶簡(jiǎn)稱是商務(wù)人員自己填的,這個(gè)字段支持用戶錄入各種字符。但是下游...
    冬天里的懶喵閱讀 971評(píng)論 0 0
  • (三)字符編碼的由來(lái) 一、為什么需要對(duì)字符進(jìn)行編碼 計(jì)算機(jī)一開(kāi)始發(fā)明出來(lái)時(shí)是用來(lái)解決數(shù)字計(jì)算問(wèn)題的,后來(lái)人們發(fā)現(xiàn),...
    古劍誅仙閱讀 1,371評(píng)論 0 0

友情鏈接更多精彩內(nèi)容