내 시스템 언어는 일본어가 아니지만 사용자 언어/인코딩은 일본어입니다. 터미널 에뮬레이터에서 셸을 "직접" 사용하면 잘 작동하지만 "뒤에서" 작업은 작동하지 않는 것 같습니다.
保存 = 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