이것은 명령줄에서 절반 너비를 전체 너비로 변환하는 방법에 대한 간단한 질문입니다. 나는 이것이 내 명령줄에 내장될 것이라고 생각했지만 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
uconv
ICU 도구의 유틸리티가 있는 경우 ( icu-devtools
Debian 기반 운영 체제의 패키지):
$ 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 로케일인 경우 동일한 작업을 수행할 수 있습니다.tr
OS 공급업체에서 패치하지 않는 한 현재 버전의 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 -l
uconv -l
지원되는 인코딩/문자 집합도 비슷하게 나열되어 있습니다. uconv -L
번역자를 나열합니다. GNU는 해당 문자가 대상 문자 세트에 존재하지 않는 경우에만 가능한 근사값을 제공합니다(그렇지 않으면 iconv
해당 문자를 버립니다).//translit
//ignore
1 또는 문자에스æ
-> ae
또는 ffi
-> ffi
와 같이 전체 너비 형식은 없지만 예를 들어 한 번 근사하면 여기에 언급된 솔루션 중 어느 것도 처리할 수 없는 전체 너비 대신 affix
에 변환할 수 있습니다. .affix
affix