전자 문자를 반자 문자로(또는 그 반대로) 변환하는 방법은 무엇입니까?

전자 문자를 반자 문자로(또는 그 반대로) 변환하는 방법은 무엇입니까?

이것은 명령줄에서 절반 너비를 전체 너비로 변환하는 방법에 대한 간단한 질문입니다. 나는 이것이 내 명령줄에 내장될 것이라고 생각했지만 iconv여기서는 아무것도 찾을 수 없습니다.

$ iconv  -l | grep -i full
-> nothing
$ iconv  -l | grep -i half
-> nothing

일반적인 입력은 다음과 같습니다.

$ echo -n "Ab9876543210" | iconv -f utf8 -t utf16be | hexdump -C
00000000  ff 21 00 62 ff 19 ff 18  ff 17 ff 16 ff 15 ff 14  |.!.b............|
00000010  ff 13 ff 12 ff 11 ff 10                           |........|
00000018

답변1

uconvICU 도구의 유틸리티가 있는 경우 ( icu-devtoolsDebian 기반 운영 체제의 패키지):

$ echo 'Ab9876543210' | uconv -x Fullwidth-Halfwidth
Ab9876543210

(또한 한국어나 일본어 스크립트와 같이 일반적으로 전자인 문자를 반자 표시로 변환합니다.)

대신에 그 반대를 하십시오 Halfwidth-Fullwidth.

그렇지 않은 경우 ASCII 인쇄 가능 문자의 전체 너비 변형만 변환하는 데 관심이 있습니다.

$ echo 'Ab9876543210' | perl -C -pe 'y/\x{ff01}-\x{ff5e}/!-~/'
Ab9876543210

또는 U+3000(표의 문자 공백)을 ASCII 공백으로 변환할 수도 있습니다.

$ echo 'Ab9876543210' | perl -C -pe 'y/\x{3000}\x{ff01}-\x{ff5e}/ !-~/'
Ab9876543210
curl -s https://www.unicode.org/Public/UNIDATA/UnicodeData.txt | grep '<wide>'

목록에 추가할 수 있는 일부 비ASCII 문자의 전체 너비 변형인 일부 추가 콘텐츠가 표시됩니다.

perl -C -pe 'y/\x{3000}\x{ff01}-\x{ff60}\x{ffe0}-\x{ffe6}/ !-~\x{2985}\x{2986}\xa2\xa3\xac\xaf\xa6\xa5\x{20a9}/'

(검색에서는 <narrow>일반적인 전자 문자의 일부 반자 변형이 표시되지만 이는 큰 목록이고 연속되지 않은 범위를 가지므로 이를 추가하면 표현식이 더욱 커집니다.)

tr일부 시스템에서는 C.UTF-8 로케일인 경우 동일한 작업을 수행할 수 있습니다.trOS 공급업체에서 패치하지 않는 한 현재 버전의 GNU에서는 작동하지 않습니다..

$ uname
FreeBSD
$ echo 'Ab9876543210' | LC_ALL=C.UTF-8 tr $'\u3000\uff01-\uff5e' ' !-~'
Ab9876543210

(또한 쉘이 zsh 를 지원한다고 가정 $'\uXXXX').

역변환의 경우 로 y/from/to/변경하면 y/to/from/.

perl모듈에는 유니코드 데이터에 대한 인터페이스도 있으므로 Unicode::UCD다음과 같은 작업도 수행할 수 있습니다.

perl -C -MUnicode::UCD=charprop -pe '
  s{\p{Decomposition_Type: Wide}}{
    $cache{$&} //= charprop(ord($&), "Decomposition_Mapping")
  }ge'

캐싱을 사용하여 완화하더라도 여전히 상당히 느립니다. 자세한 내용은 및 를 참조하세요 perldoc perluniprops.perldoc Unicode::UCD

또는 사용NFKD 분해가지고 계신 분들을 위해넓은분해 유형:

perl -MUnicode::Normalize=NFKD -C -pe 's/\p{Dt=Wide}/NFKD$&/ge'

적어도 GNU 시스템에서 ASCII로 변환하는 경우 iconv -t ASCII//translit이러한 문자(그리고 더 많은 문자도 가장 가까운 ASCII 문자 1 표현으로 변환됩니다)

$ echo 'Stéphane' | iconv -t ASCII//translit
Stephane

물론 그 반대의 방법은 없습니다.

어쨌든 여기서는 동일한 문자를 문자 세트에서 원하는 문자 세트로 변환하는 것이 아니라 일부 문자를 다른 문자로 음역하는 일종의 음역입니다.

iconv -luconv -l지원되는 인코딩/문자 집합도 비슷하게 나열되어 있습니다. uconv -L번역자를 나열합니다. GNU는 해당 문자가 대상 문자 세트에 존재하지 않는 경우에만 가능한 근사값을 제공합니다(그렇지 않으면 iconv해당 문자를 버립니다).//translit//ignore


1 또는 문자에스æ-> ae또는 -> ffi와 같이 전체 너비 형식은 없지만 예를 들어 한 번 근사하면 여기에 언급된 솔루션 중 어느 것도 처리할 수 없는 전체 너비 대신 affix에 변환할 수 있습니다. .affixaffix

관련 정보