유니코드 값으로 문자를 파악하는 방법은 무엇입니까?

유니코드 값으로 문자를 파악하는 방법은 무엇입니까?

텍스트 파일에 유니코드 코드 포인트 16A0으로 표시되는 유니코드 문자 ᚠ가 있습니다(텍스트 파일은 utf-8로 인코딩(?)됩니다).

내가 할 때 grep '\u16A0' test.txt결과가 없습니다. 해당 캐릭터를 어떻게 파악합니까?

답변1

당신이 사용할 수있는ANSI-C 인용ANSI C 표준에 지정된 대로 백슬래시로 이스케이프된 문자를 대체하기 위해 쉘에서 제공합니다. 이는 grepBash 및 Zsh와 같은 셸에서 뿐만 아니라 모든 명령에 대해 작동합니다 .

grep $'\u16A0'

좀 더 복잡한 예를 보려면 다음을 참조하세요.이 관련 질문그리고 그 대답.

답변2

당신은 사용할 수 있습니다유그레프유니코드 코드 포인트 U+16A0과 일치하도록 grep을 즉시 대체합니다.

ugrep '\x{16A0}' test.txt

grep과 동일한 옵션을 사용하지만 다음과 같이 훨씬 더 많은 기능을 제공합니다.

ugrep은 UTF-8/16/32 입력 및 기타 형식을 검색합니다.. 옵션 -Q를 사용하면 ISO-8859-1~16, EBCDIC, 코드 페이지 437, 850, 858, 1250~1258, MacRoman 및 KIO8과 같은 다른 많은 파일 형식을 검색할 수 있습니다.

ugrep은 유니코드 패턴과 일치합니다.기본적으로(-U 옵션으로 비활성화됨) 정규식 패턴 구문은 PCRE와 유사한 구문으로 확장된 POSIX ERE 호환입니다. 옵션 -P는 유니코드 패턴과 Perl 일치에 사용될 수도 있습니다.

보다GitHub의 ugrep자세한 내용은.

답변3

사용라쿠(이전에는 Perl_6으로 알려짐)

샘플 입력:

https://www.cogsci.ed.ac.uk/~richard/unicode-sample-3-2.html


문자를 일치시키고 다음 줄을 인쇄하십시오.

~$ raku -ne '.put if m/ \x[16A0] /;'  file
ᚠ ᚡ ᚢ ᚣ ᚤ ᚥ ᚦ ᚧ ᚨ ᚩ ᚪ ᚫ ᚬ ᚭ ᚮ ᚯ ᚰ ᚱ ᚲ ᚳ ᚴ ᚵ ᚶ ᚷ ᚸ ᚹ ᚺ ᚻ ᚼ ᚽ ᚾ ᚿ ᛀ ᛁ ᛂ ᛃ ᛄ ᛅ ᛆ ᛇ ᛈ ᛉ ᛊ ᛋ ᛌ ᛍ ᛎ ᛏ ᛐ ᛑ ᛒ ᛓ ᛔ ᛕ ᛖ ᛗ ᛘ ᛙ ᛚ ᛛ ᛜ ᛝ ᛞ ᛟ ᛠ ᛡ ᛢ ᛣ ᛤ ᛥ ᛦ ᛧ ᛨ ᛩ ᛪ ᛫ ᛬ ᛭ ᛮ ᛯ ᛰ

#OR:

~$ raku -e  'lines.grep(/ \x[16A0] /).put;'  file
ᚠ ᚡ ᚢ ᚣ ᚤ ᚥ ᚦ ᚧ ᚨ ᚩ ᚪ ᚫ ᚬ ᚭ ᚮ ᚯ ᚰ ᚱ ᚲ ᚳ ᚴ ᚵ ᚶ ᚷ ᚸ ᚹ ᚺ ᚻ ᚼ ᚽ ᚾ ᚿ ᛀ ᛁ ᛂ ᛃ ᛄ ᛅ ᛆ ᛇ ᛈ ᛉ ᛊ ᛋ ᛌ ᛍ ᛎ ᛏ ᛐ ᛑ ᛒ ᛓ ᛔ ᛕ ᛖ ᛗ ᛘ ᛙ ᛚ ᛛ ᛜ ᛝ ᛞ ᛟ ᛠ ᛡ ᛢ ᛣ ᛤ ᛥ ᛦ ᛧ ᛨ ᛩ ᛪ ᛫ ᛬ ᛭ ᛮ ᛯ ᛰ

문자를 일치시키고 (공백으로 구분된) "단어"를 인쇄합니다.

~$ raku -ne 'for .words() { .put if m/ \x[16A0] / };'  file

#OR:

~$ raku -e  'words.grep(/ \x[16A0] /).put;'  file

문자를 일치시키고 (정확히) 일치하는 항목을 인쇄합니다.

~$ raku -e 'given slurp() { put m:g/  \x[16A0]  / };'   file

#OR:

~$ raku -e 'slurp.match(:global,/  \x[16A0]  /).put;'   file

문자를 일치시키고 일치 항목을 세어 인쇄합니다.

~$ raku -e 'given slurp() { put m:g/  \x[16A0]  /.Int };'   file
1

#OR:

~$ raku -e 'slurp.match(:global,/  \x[16A0]  /).elems.put;'   file
1 

노트:

  1. Raku에서는 와 같은 유니코드 이름과 쉽게 일치시킬 수 있으며 \c[RUNIC LETTER FEHU FEOH FE F], 이는 위와 일치하는 것과 동일한 결과를 제공합니다 \x[16A0].

  2. Raku에서는 와 같은 유니코드 문자와 쉽게 일치시킬 수 있으며 , 이는 이상 과 일치하는 것과 동일한 결과를 제공합니다 .\x[16A0]\c[RUNIC LETTER FEHU FEOH FE F]

  3. Raku에서는 유니코드 변수(및 유니코드 연산자)를 사용할 수 있습니다. 그래서 이것은 작동합니다 :

~$ raku -e 'my $ᚠ = slurp.match(/  \x[16A0]  /); say $ᚠ.Str.raku;'   file
"ᚠ"

https://docs.raku.org/언어/regexes#Unicode_properties
https://docs.raku.org/언어/unicode
https://docs.raku.org
https://raku.org

답변4

perl, pcre2grep또는 최소한 PCRE 또는 PCRE2를 사용하거나 사용할 수 있는 구현 pcregrep을 사용하면 문자를 값과 일치시키는 데 grep사용할 수 있습니다 (또는 값 <= 0xff인 경우에만).\x{16A0}0x16A0\xe9

해당 값이 유니코드 코드 포인트가 되려면 입력이 UTF-8에서 디코딩되어야 한다고 알려야 합니다. PCRE/PCRE2에서는 (*UTF)패턴의 시작 부분에 를 사용하는 방식으로 이루어지지만 (대부분 PCRE_UTF정규 표현식 엔진에 전달하는 것과 동일), 최신 버전의 GNU에서는 grep최소한 UTF-8을 참맵으로 사용하는 로케일에서 호출할 때 자동으로 이를 수행합니다. pcregrep및 을 사용하면 옵션 pcre2grep을 통해 활성화할 수도 있습니다 -u( 참조 -U) pcre2grep.

에서는 환경 변수 의 (큰 문자) 옵션을 perl통해 이루어집니다 . 단독 으로 , for는 로케일이 GNU처럼 UTF-8을 사용 하는 경우 입력/출력을 UTF-8로 디코딩/리코딩하거나 무조건 그렇게 하거나 모듈을 사용하여 모든 인코딩에서 명시적으로 디코딩하는 것입니다 .-CPERL_UNICODE-C-CSDLgrep-CSDEncode

및 PCRE2( GNU 또는 최신 버전 perl에서 사용됨 ) 에서는 . 그리고 유니코드 이름은 다음과 같습니다: .pcre2grepgrep\N{U+16A0}perl\N{RUNIC LETTER FEHU FEOH FE F}

그래서:

perl -C -ne 'print if /\x{16A0}/'
perl -C -ne 'print if /\N{U+16A0}/'
perl -C -ne 'print if /\N{RUNIC LETTER FEHU FEOH FE F}/'
PERL_UNICODE=SD perl -ne 'print if /\x{16A0}/'
pcregrep -u '\x{16A0}'
pcregrep '(*UTF)\x{16A0}'
pcre2grep -u '\x{16A0}'
pcre2grep '(*UTF)\x{16A0}'
pcre2grep -U '\x{16A0}'
pcre2grep -u '\N{U+16A0}'
grep -P '\x{16A0}'

UTF-8로 인코딩되지 않은 입력에서 유니코드 값을 기반으로 문자를 일치시키려면 UTF-8에서만 작동하므로 작동하지 않습니다. 단일 바이트 문자 집합에서는 \xHHby 값(유니코드가 아닌 해당 문자 집합의 코드 포인트)에서 작동합니다.

예를 들어 en_GB.iso885915유로 기호(U+20AC)가 0xA4에 있는 로케일에서.

$ LC_ALL=en_GB.iso885915 luit
$ locale charmap
ISO-8859-15
$ printf %s € | od -An -vtx1
 a4
$ echo € | grep -P '\x{20ac}'
grep: character code point value in \x{} or \o{} is too large
$ echo € | grep -P '\N{U+20ac}'
grep: \N{U+dddd} is supported only in Unicode (UTF) mode
$ echo € | grep -P '(*UTF)\N{U+20ac}'
$ echo € | grep -P '\xA4'

따라서 옵션은 텍스트를 UTF-8로 변환하는 것입니다.

$ echo € | iconv -t utf-8 | LC_ALL=C.UTF-8 grep -P '\x{20ac}' | iconv -f utf-8

또는 UTF-8이 아닌 로케일의 문자 집합에 따라 입력/출력을 디코딩/인코딩하도록 지시하는 대신 perluse를 사용하는 경우:-Mopen=locale-C

$ echo € | perl -Mopen=locale -ne 'print if /\N{U+20ac}/'

또는 디코딩을 수행하지 않고 로케일에서 해당 문자의 바이트 값을 일치시킵니다.

예를 들어, GNU나 zsh 또는 최신 버전의 bash를 사용하면 다음과 같습니다 printf.

$ locale charmap
ISO-8859-15
$ printf '\u20ac' | od -An -vtx1
 a4
$ echo € | grep -F -- "$(printf '\u20ac')"

zsh에서는 당시 현재 로케일의 문자 인코딩으로 확장되는 which를 사용할 수도 있습니다 $'\u20ac'(해당 로케일에 해당 문자가 없으면 오류를 보고합니다).

$ echo € | grep -F -- $'\u20ac'

ksh93, bash, mksh 및 몇 가지 ash 기반 쉘을 포함한 이후 여러 다른 쉘이 zsh에서 이를 복사했지만 $'\uHHHH'불행한 차이점이 있습니다. ksh에서는 로케일에 관계없이 UTF-8로 확장되고 bash에서는 코드가 실행될 때가 아니라 코드를 읽을 때의 로케일입니다. 예를 들어 다음과 같습니다 bash.

LC_CTYPE=C.UTF-8
{
  LC_CTYPE=en_GB.iso885915
  printf '\xA4\n' | grep -F -- $'\u20ac'
}

또는:

LC_CTYPE=C.UTF-8
euro() {
  grep -F -- $'\u20ac'
}
LC_CTYPE=en_GB.iso885915
printf '\xa4\n' | euro

두 경우 모두 셸에서 구문 분석할 때까지 실행되지 않았기 $'\u20ac'때문에 가 UTF-8 인코딩으로 확장되기 때문에 작동하지 않습니다 .LC_CTYPE=en_GB.iso885915$'\u20ac'

관련 정보