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