Help us understand the problem. What is going on with this article?

Goで文字列の先頭から特定の文字数だけ切り取りたい

More than 3 years have passed since last update.

Goで文字列の先頭から特定の文字数だけを出力するのが、意外と悩んだのでちょっとメモします。

Goでは文字列はbyteのsliceのような扱いになります。なのでASCIIコードはいいのですが、UTF-8の文字列を適当に扱うと、UTF-8の文字列として不正なバイト列になることがあります(UTF-8は変なところで切ると必ず不正なバイト列になる)。

今回は『こんにちは』という文字列の先頭2文字だけを表示することを考えます。

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    str := "こんにちは"

    fmt.Println(len(str))
    fmt.Println(utf8.RuneCountInString(str))
    fmt.Println(str[:3])
    fmt.Println(string([]rune(str)[:2]))
}

出力:

15
5
こ
こん

文字列でlenを使うとバイト列としての長さが出るので、ひらがなだと文字数の3倍になるはずです。UTF-8の文字列としての長さを知りたい場合はutf8.RuneCountInStringを使う必要があります。

そしてruneというのがUTF-8の1文字を表すので、文字列をruneのsliceにキャストします。そうすれば先頭2文字を切り出す事はできるので、それをstringにキャストすればいいです。

もっと簡単にできる方法があれば、教えてくれるとうれしいです。

catatsuy
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away