1
1

More than 3 years have passed since last update.

【Golang】文字列を固定幅(固定長)で改行する。全角文字列の WordWrap

Last updated at Posted at 2021-02-20

UTF-8 マルチバイト文字列を全角 n 文字(半角 n*2 文字)の固定長で改行させたい

対象文字列
あいうえおかきくけこさしすせそたちつてと
123456789012345678901234567890

n=6で改行
あいうえおか
きくけこさし
すせそたちつ
てと
123456789012
345678901234
567890

等幅フォントでない限り、全角 1 文字 == 半角 2 文字 の文字幅にならないのは当然として、それでも CLI アプリやコマンドのヘルプ表示など、なるべく等幅(1 行が固定長)になるように折り返したいのです。

つまり Golang の WordWrap がしたい。

しかし「"golang" 文字列 固定幅 改行」でググっても、なかなかヒットしなかったり、ルーンをゴニョゴニョしろとは言うもの具体的なものがなかったので、自分のググラビリティとして。

TL; DR (今北産業)

  1. github.com/mattn/go-runewidth パッケージの runewidth を使う。 go-runewidth@mattn さんによる awesome-go なパッケージです。
  2. runewidth.Wrap(s string, w int) string メソッドで文字列 sw 文字幅で改行した文字列が取得できる。
  3. 全角 3 文字の場合は result := runewidth.Wrap(myString, 3 * 2) と 2 倍にする。

TS; DR

sample.go
package main

import (
    "fmt"
    "strings"

    "github.com/mattn/go-runewidth"
)

// WrapZenkakuString は文字列を固定幅で折り返します。幅の指定(width)は全角文字数を指定します。
// 半角文字は、その倍の文字数で折り返されます。主にヘルプ表示などに使われ、フォントによっては必ずし
// も固定幅になるとは限りません。
func WrapZenkakuStringSample(input string, width int) string {
    replacer := strings.NewReplacer(
        "\n", "",
        "\r", "", // Windows
        "。", "。\n",
    )

    replaced := replacer.Replace(input)

    return runewidth.Wrap(replaced, width*2)
}

func main() {
    var msgHelp string = `
これはサンプルのヘルプです。
アイウエオかきくけこサシスセソたちつ
てとナニヌネコ。`

    fmt.Println(WrapZenkakuString(msgHelp, 6))
}

実行結果
$ go run .
これはサンプ
ルのヘルプで
す。
アイウエオか
きくけこサシ
スセソたちつ
てとナニヌネ
コ。

参考文献

関連文献

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1