私は次のように変換します。整数到着性格そして性格到着整数バッシュから。しかし、私はprintf \\$(printf '%03o' $1)
どのように働くのかわかりませんprintf '%d' "'$1"
。printf \\$(printf '%03o' $1)
どのように機能するか説明して くださいprintf '%d'
。
#!/bin/bash
# chr() - converts decimal value to its ASCII character representation
# ord() - converts ASCII character to its decimal value
chr() {
printf \\$(printf '%03o' $1)
}
ord() {
printf '%d' "'$1"
}
ord A
echo
chr 65
echo
ベストアンサー1
printf '\101'
ここで101
、8進数は対応する値でバイトを出力します。
A
ASCII端末に送信されると、ASCIIおよびA
すべてのASCII互換文字セット(ほとんどの最新の文字セットが含まれていますが、一部のIBMシステムではまだ使用されているEBCDIC文字セットを含む)の文字65(8進数101)としてレンダリングされます。
存在する
printf \\$(printf '%03o' $1)
次のように書く必要があります。
printf "\\$(printf '%03o' "$1")"
Bourneなどのシェルでは、パラメータ拡張(例$1
:)またはコマンド置換($(...)
)を引用符で囲まないままにすることは分割+グローブ演算子なので、ここでは必要ありません。
printf '%03o' "$1"
$1
数字を3桁の8進数に変換printf "\\$(...)"
\
8進数をa(\\
二重引用符で囲む)に追加して\
渡し、対応するprintf
バイト値を出力します。
文字セットが文字ごとに1バイトのロケール(たとえばiso8859-1
)、またはマルチバイト文字セットを持つロケールでのみ機能し、値は0から127に対してのみ機能します。
存在するbash
、
printf '%d\n' "'A"
文字のUnicodeコードポイントを印刷しますA
(または少なくともGNUシステムでは、返された値はmbtowc()
少なくともUnicodeコードポイントです)。
他のいくつかの実装(スタンドアロンGNUprintf
ユーティリティを含む)は、文字の最初のバイト値を返します。
これは、ASCIIベースのシステムなどのASCII文字にはA
違いはありませんが、他の文字の場合は重要です。たとえば、ギリシャα
文字(U + 03B1)は次のようにエンコードされます。
- iso8859-7のバイト225(標準ギリシャ語のシングルバイト文字セット)
- UTF-8のバイト206 177(Unixファミリーシステムで最も一般的に使用されるUnicodeエンコーディング)
- GB18030(Unicodeの公式中国語エンコーディング)のバイト166193です。
Bashはロケールに関係なく(少なくともGNUシステムでは)Unicodeコードポイント(16進数で0x03b1)をprintf '%d\n' "'α"
常に出力しますが、他の言語はロケールに応じて225、206、または166を返すことがあります。945
α
ASCII文字(または値0〜127)またはすべての文字の文字セット(値0〜255)を使用するロケールの場合、これらのchr
合計はord
単に互いに逆数であることがわかります。iso8859-1
Unicodeコードポイントを返す場合は、ord()
その逆(Unicodeコードポイントに対応する文字印刷)は次のようになります。
chr() {
printf "\U$(printf %08X "$1")"
}
bash
(4.3以上の仮定(\UXXXXXXXX
4.2に追加されましたが、4.3以前はU + 0080〜U + 00FF文字では正しく機能しませんでした))。
次に、すべてのロケールで次の操作を行います。
$ ord α
945
$ chr 945
α
またはord()
(現在のロケールで)与えられた文字のエンコードされたバイト値を返します。
ord() {
printf %s "$1" | od -An -vtu1
}
次のバイトを出力しますchr()
。
chr() {
printf "$(printf '\\%o' "$@")"
}
次に、たとえばUTF-8ロケールで次のようにします。
$ ord α
206 177
$ chr 206 177
α
(あなたはord α
945を受け取り、chr
そしてゴミを受け取りますchr 945
)chr 206 177
。
またはロケールで使用してくださいiso8859-7
。
$ ord α
225
$ chr 225
α
(945を提供しますが、GNUシステムでifに置き換えると、ord α
225を提供できます。)printf
/usr/bin/printf