유니코드 코드 포인트 [0-9A-F]를 bash에서 인쇄 가능한 문자로 변환하는 방법은 무엇입니까?

유니코드 코드 포인트 [0-9A-F]를 bash에서 인쇄 가능한 문자로 변환하는 방법은 무엇입니까?

유니코드 코드 포인트 목록이 있지만 이러한 16진수 값을 해당 문자가 나타내는 실제 문자로 변환하는 "쉬운" 방법을 모르겠습니다...

나는 들었다다루기 힘든echo -e '\u0965', 하지만 저는세게 때리다4.1.

bash에 대한 zsh 방법만큼 간단한 것이 있습니까?

답변1

iconv와 함께 GNU coreutils에서 bash의 echo 또는 /bin/echo를 사용할 수 있습니다.

echo -ne '\x09\x65' | iconv -f utf-16be

기본적으로 iconv는 로케일 인코딩으로 변환됩니다. 아마도 Perl은 특정 쉘이나 echo 명령에 의존하는 것보다 이식성이 더 좋을 것입니다. 내가 아는 대부분의 UNIX 시스템은 Perl을 제공하며 Windows 포트도 여러 개 있습니다.

perl -C -e 'print chr 0x0965'

대부분의 경우 이 작업을 수행해야 할 때는 지원 기능이 내장된 Vim/GVim과 같은 편집기를 사용합니다. 삽입 모드에서 Ctrl-V를 누른 다음 u를 누른 다음 4개의 16진수 문자를 입력합니다. U+FFFF 이외의 문자를 원할 경우 대문자 U를 사용하고 8개의 16진수 문자를 입력하세요. Vim은 만들기 쉬운 사용자 정의 키맵도 지원합니다. 일련의 문자를 다른 기호로 변환합니다. 예를 들어, 저는 TM을 ™로, (C)를 ©로, (R)을 ®로 변환하는 www라는 키맵을 개발했습니다. 필요할 경우를 대비해 Klingon의 키맵도 가지고 있습니다. Emacs에도 비슷한 것이 있다고 확신합니다. GVim 및 GNOME 터미널이 포함된 GTK+ 애플리케이션을 사용하는 경우 Control-Shift-u 뒤에 4개의 16진수 문자를 입력하여 유니코드 문자를 만들 수 있습니다. KDE/Qt에도 비슷한 것이 있을 것이라고 확신합니다.

고쳐 쓰다:Bash 4.2부터는 이제 내장 기능인 것 같습니다.

echo $'\u0965'

고쳐 쓰다:또한 요즘에는 Perl보다 Python 예제가 더 선호될 수 있습니다. 이는 Python 2와 3 모두에서 작동합니다.

python -c 'print(u"\u0965")'

답변2

배쉬 4.2(2011년 출시) echo -e '\u0965', printf '\u0965'및 에 대한 printf %b '\u0965'지원이 추가되었습니다 echo $'\u0965'.

http://tiswww.case.edu/php/chet/bash/FAQ:

o   $'...', echo, and printf understand \uXXXX and \UXXXXXXXX escape sequences.

답변3

GNU coreutils가 있는 경우 다음을 시도해 보십시오 printf.

$ printf '\u0965\n'

echo콘솔이 UTF-8을 사용하고 UTF-8 인코딩이 있는 경우 다음을 수행할 수 있습니다.

$ echo -e '\xE0\xA5\xA5'

유니코드에서 UTF-8 16진수로 인코딩된 표는 여기에서 찾을 수 있습니다.http://www.utf8-chartable.de/. 다양한 스크립트 언어를 사용하여 유니코드 코드 포인트를 16진수로 변환할 수 있습니다. 다음은 Python을 사용한 예입니다.

python -c "print(unichr(int('0965', 16)).encode('utf-8').encode('hex'))"

다음은 인수를 올바른 16진수 값으로 변환하는 Perl 스크립트입니다(여기에는 불필요한 괄호가 많이 있습니다).

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Encode;

foreach (@ARGV) {
    say unpack('H*', encode('utf8', chr(hex($_))))
}

예를 들어,

./uni2utf 0965
e0a5a5

물론 Perl이나 Python이 있다면 이를 사용하여 문자를 인쇄할 수도 있습니다.

답변4

Bash 버전 4.2(및 이후 버전)에서 패턴 대체를 사용합니다.

${parameter/pattern/string}

여기에 명시된 바와 같이http://steve-parker.org/sh/tips/pattern-substitution/

UNICODE_HEX="U+02211"
printf ${UNICODE_HEX/U+/"\U"}

UNICODE_HEX="U+03BB"
printf ${UNICODE_HEX/U+/"\U"}
λ         

관련 정보