UTF8文字をスラッシュでエスケープされた数値に変換する

UTF8文字をスラッシュでエスケープされた数値に変換する

私のシステム言語は日本語ではありませんが、ユーザー言語/エンコードは日本語です。ターミナルエミュレータでシェルを「直接」使用するとうまく機能しますが、「後ろから」操作は機能しないようです。

保存 = Save for example.

Xアイテムを「直接」使用すると(たとえば、ターミナルエミュレータまたはGUIプログラムを開いて直接操作する場合)、正しく表示されますが、バックグラウンドでアイテムを実行すると(xmonad WMでdmenuを使用)、結果は次のようになります。スクリプトに入力されるのは、文字列比較を実行できるわけではありませんが、次のようになります。

保存...

~になる

'\344\277\235\345\255\230...'

これを直接生成するにはどうすればよいですか?コピーして貼り付けた内容をスクリプトに入れて、エスケープされた値文字列を取得しました。

これらのエスケープされた値の文字列を「正しい」文字列に変換してから、後で大文字と小文字の一致を実行する前渡しを実行することを嬉しく思います。

ハッキングに頼らずにこれらのエスケープされた値文字列を直接生成したいと思います。

ベストアンサー1

シェルにはzsh次のものがあります。

string="保存 = Save for example.
Also including newlines,
'quotes and \backslashes"

() {
  local LC_ALL=C
  quoted=${${(qqqq)1}#'$'}
} "$string"

printf '%s\n' $quoted

以下を提供します。

'\344\277\235\345\255\230 = Save for example.\nAlso including newlines,\n\'quotes and \\backslashes'

0x80以上のバイトのみを変換したい場合\ooo

printf %s "$string" |
  perl -l -0777 -pe 's/[\x80-\xff]/sprintf "\\%o", ord$&/ge'

(Bourneのようなシェルから)以下を提供します。

\344\277\235\345\255\230 = Save for example.
Also including newlines,
'quotes and \backslashes

おすすめ記事