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

관련 정보