4

記号とUnicode番号(すべて長さ4)の組み合わせを含むリストがあり、そのうちのいくつかは基本ラテン文字の一部です。それらをすべてシンボルとして印刷したい。

Bash(Cygwinの下)を使用して失敗した試みの例:

list="0 3 4 5 005e 0060 00ff"
$ for c in $list; do [[ ${#c} = 4 ]] && env printf "\\u$c\n" || echo $c; done
0
3
4
5
printf: invalid universal character name \u005e
005e
`
ÿ

ターミナルのロケールやエンコーディングに関係なく、同じ問題が発生します。

この問題の答えをaskununtuから機能させることができません:https ://askubuntu.com/questions/20806/why-does-printf-report-an-error-on-all-but-three-ascii-range- unicode-codepoint

4

1 に答える 1

3

この修正により、任意のエンコーディングで任意の文字を使用できるようになります。

list="0 3 4 5 005e 0060 00ff"
for c in $list; do
    if [ ${#c} = 4 ]; then
        echo 0 "$c" | xxd -r | iconv -f UNICODEBIG -t UTF-8
        echo
    else
        echo "$c"
    fi
done

-rオプションを指定したxxdは、16進テキストをバイトに変換します。行番号が必要です。これは、エコーの先頭の0です。この場合のxxdは、cで示される2バイトを出力します。

xxdの結果はiconvにパイプされます。iconvは、あるエンコーディングを別のエンコーディングに変換します。UNICODEBIGは、最初のバイトが最も重要な2バイトのUnicode文字です。UTF-8は、変換するエンコーディングです。(UTF-8を使用しない場合は、端末のエンコーディングに置き換えてください)。これにより、文字が指定されたエンコーディングに変換されます。

このトリックにより、0000からffffまでの任意のUnicode文字を、それをサポートする任意のエンコードで完全に自由にエンコードできます。

編集:xxdを使用してより簡単な方法を見つけました。新しい方法は上に示されています、古い方法はここにあります:

echo -ne \\x"${c:0:2}"\\x"${c:2:2}" | iconv -f UNICODEBIG -t UTF-8
于 2012-10-02T18:31:45.520 に答える