私はbashのprintfでUnicode文字列を埋めようとし、これを見ました。
printf "%2s" a
予想される「a」を生成します。
Unicodeバリアント
printf "%2s" ä
驚くほど満たされていない「ä」を生成します。 (zshは期待される結果を提供します。)
この問題の原因は何ですか? bashでUnicode文字列をどのように入力しますか?
ベストアンサー1
文字はä
2バイトを使用してUTF-8でエンコードされるため、Printfはそれを2パディングとして扱います。
-m
Wcは文字列の文字()とバイト()を計算できます。-c
その後、Printfに与えられた数字はです[intended pad]+[bytes]-[chars]
。だから私はこのpad.sh
スクリプトを組み立てました。
#!/bin/sh
bytes=$(printf '%s' "$2" | wc -c)
chars=$(printf '%s' "$2" | wc -m)
n=$(($1+bytes-chars))
printf "%${n}s" "$2"
以下の例の実行では、明確にするために、各出力の後に人工的に改行文字を追加しました。
$ sh pad.sh 10 abcdef
abcdef
$ sh pad.sh 10 äéßôçÈ
äéßôçÈ