이것은 Ubuntu Online, Fedora Online, Windows 온라인 에뮬레이터 또는 MAC OS 온라인 에뮬레이터와 같은 여러 무료 온라인 워크스테이션 중 하나를 사용하여 OnWorks 무료 호스팅 제공자에서 실행할 수 있는 perlunicook 명령입니다.
프로그램:
이름
perlunicook - Perl에서 유니코드를 처리하는 요리책 같은 예
기술
이 매뉴얼 페이지에는 일반적인 유니코드 작업을 처리하는 방법을 보여주는 짧은 레시피가 포함되어 있습니다.
Perl에서는 마지막에 완전한 프로그램 하나가 추가됩니다. 각 코드에서 선언되지 않은 변수는
요리법은 이전에 적절한 값을 가지고 있다고 가정합니다.
사용 예
X 0: Standard 전문
달리 언급되지 않는 한, 아래 모든 예제는 이 표준 서문이 작동해야 합니다.
"#!"를 시스템에 맞게 조정하여 올바르게 작동하도록 하세요.
#!/usr/빈/환경 펄
utf8을 사용하세요. # 리터럴과 식별자가 UTF-8일 수 있도록 하세요.
"unicode_strings" 기능을 얻으려면 v5.12; # 이상을 사용하세요.
strict를 사용하세요; # 문자열을 인용하고 변수를 선언하세요
경고를 사용하세요. # 기본적으로 켜짐
경고 사용 qw(FATAL utf8); # 인코딩 오류를 치명적으로 처리
open qw(:std :utf8);를 사용하세요. # UTF-8에서 선언되지 않은 스트림
charnames qw(:full :short);를 사용하세요. # v5.16에서는 필요하지 않습니다.
이 하지 Unix 프로그래머가 바이너리 스트림을 "binmode"로 설정하거나 다음을 사용하여 열 수 있도록 합니다.
":raw"를 사용할 수도 있지만, 그게 이식성 있게 접근할 수 있는 유일한 방법이거든요.
경고: "use autodie"(2.26 이전)와 "use open"은 서로 어울리지 않습니다.
X 1: 일반적인 유니코드에 정통한 필터링
항상 들어올 때 분해되고, 나올 때 다시 분해됩니다.
Unicode::Normalize를 사용합니다.
동안(<>) {
$_ = NFD($_); # 정식으로 분해 + 재정렬
...
} 계속하다 {
NFC($_);를 인쇄합니다. # 재구성(가능한 경우) + 정식으로 재정렬합니다.
}
X 2: 미세 조정 유니 코드 경고
v5.14부터 Perl은 UTFX8 경고의 세 가지 하위 클래스를 구분합니다.
v5.14를 사용하세요. # 이전에는 하위 경고를 사용할 수 없습니다.
경고 없음 "nonchar"; # 금지된 66개의 비문자
경고 없음 "대리인"; # UTF-16/CESU-8 말도 안 됨
0x10_FFFF 이상의 코드 포인트에 대해 "non_unicode" 경고가 발생하지 않습니다.
X 3: 선언 in utf8 을 통한 식별자 그리고 리터럴
모든 중요한 "use utf8" 선언 없이 리터럴에 UTFX8을 넣고
식별자가 제대로 작동하지 않습니다. 위에서 언급한 표준 서문을 사용했다면
이미 발생한 일입니다. 만약 그렇다면 다음과 같이 할 수 있습니다.
UTF8을 사용하십시오.
내 $measure = "Aangstroem";
내 @Xsoft = qw( cp852 cp1251 cp1252 );
내 @XXXXXXXXX = qw( XXXX XXXXX );
내 @X = qw( koi8-f koi8-u koi8-r );
내 $motto = "XXX"; # 가족, 자라나는 마음, 드로메다리 낙타
"use utf8"을 잊어버리면 상위 바이트가 별도의 문자로 오해되어
아무것도 제대로 작동하지 않을 것이다.
X 4: 등장 인물 그리고 그들의 숫자
"ord" 및 "chr" 함수는 ASCII뿐만 아니라 모든 코드 포인트에서 투명하게 작동합니다.
X만으로는 사실 충분하지 않고, 유니코드만으로는 충분하지 않습니다.
# ASCII 문자
ord("A")
chr(65)
기본 다국어 평면의 문자 수
ord("X")
chr(0x3A3)
# BMP를 넘어서
ord("X") # 수학 이탤릭체 소문자 N
chr(0x1D45B)
# 유니코드를 넘어! (MAXINT까지)
ord("\x{20_0000}")
chr(0x20_0000)
X 5: 유니 코드 리터럴 by 문자 번호
보간된 리터럴에서 큰따옴표로 묶인 문자열이든 정규식이든 다음을 지정할 수 있습니다.
"\x{"를 사용하여 해당 숫자로 문자를 검색합니다.하하하하하}" 탈출.
문자열: "\x{3a3}"
정규식: /\x{3a3}/
문자열: "\x{1d45b}"
정규식: /\x{1d45b}/
# 정규식에서 BMP가 아닌 범위도 잘 작동합니다.
/[\x{1D434}-\x{1D467}]/
X 6: 돈을 받아가세요 문자 name by 번호
문자 이름을 사용하십시오();
내 $name = charnames::비아코드(0x03A3);
X 7: 돈을 받아가세요 문자 번호 by name
문자 이름을 사용하십시오();
내 $number = charnames::vianame("그리스 대문자 시그마");
X 8: 유니 코드 이름 문자
"\N{을 사용하세요charname}" 보간된 문자에 사용할 해당 이름의 문자를 가져오는 표기법
리터럴(큰따옴표로 묶인 문자열 및 정규 표현식). v5.16에는 암시적인
문자 이름 qw(:full :short);를 사용합니다.
하지만 v5.16 이전에는 어떤 문자 집합을 사용할지 명확하게 지정해야 합니다.
":full" 이름은 공식 유니코드 문자 이름, 별칭 또는 시퀀스로 모두 공유됩니다.
네임스페이스.
문자 이름 qw(:full :short latin greek)를 사용하세요.
"\N{수학 이탤릭 소문자 N}" # :full
"\N{그리스 대문자 시그마}" # :full
그 외의 것은 Perl 전용 편의 약어입니다. 하나 이상의 스크립트를 지정하려면 다음을 사용하세요.
스크립트에 맞는 짧은 이름을 원할 경우 이름을 지정합니다.
"\N{그리스:시그마}" # :짧음
"\N{ae}" # 라틴어
"\N{epsilon}" # 그리스어
v5.16 릴리스는 또한 문자 이름의 느슨한 일치를 위한 ":loose" 가져오기를 지원합니다.
이는 속성 이름의 느슨한 일치와 똑같이 작동합니다. 즉, 대소문자를 구분하지 않습니다.
공백 및 밑줄:
"\N{유로 기호}" # :loose (v5.16부터)
X 9: 유니 코드 이름 시퀀스
이것들은 문자 이름처럼 보이지만 여러 코드포인트를 반환합니다. %vx에 주목하세요.
"printf"의 벡터 인쇄 기능.
문자 이름 qw(:full);을 사용하세요.
내 $seq = "\N{마크론과 그레이브가 있는 라틴 대문자 A}";
printf "U+%v04X\n", $seq;
U + 0100.0300
X 10 : 관습 이름 문자
":alias"를 사용하여 기존 문자에 고유한 어휘 범위 별명을 지정하거나
이름이 없는 개인용 문자에 유용한 이름을 부여합니다.
문자 이름 ":full", ":alias" => {를 사용하세요.
ecute => "양점 부호가 있는 라틴 소문자 E",
"APPLE LOGO" => 0xF8FF, # 개인용 문자
};
"\N{귀엽다}"
"\N{애플 로고}"
X 11 : 이름 of 한중일 코드 포인트
XXXX와 같은 시노그램은 "CJK UNIFIED IDEOGRAPH-6771"의 문자 이름으로 돌아옵니다.
"CJK UNIFIED IDEOGRAPH-4EAC"는 XnamesX가 서로 다르기 때문입니다. CPAN "Unicode::Unihan"
모듈에는 이러한 것들(및 훨씬 더 많은 것들)을 디코딩하기 위한 대규모 데이터베이스가 있습니다.
출력을 이해하는 방법.
# cpan -i 유니코드::유니한
Unicode::Unihan을 사용하세요.
내 $str = "XX";
내 $unhan = 유니코드::Unihan->new;
내 $lang(qw(만다린어 광둥어 한국어 일본어온 일본어군)) {
printf "CJK $str은 %-12초 후에 ", $lang;
$unhan->$lang($str); 라고 해보세요.
}
인쇄물:
중국어로 CJK XX는 DONG1JING1입니다.
광둥어로 CJK XX는 dung1ging1입니다.
CJK XX는 한국어로 TONGKYENG입니다.
CJK XX in JapaneseOn is TOUKYO KEI KIN
일본어로 CJK XX는 HIGASHI AZUMAMIYAKO입니다.
특정 로마자 표기법이 생각나면 해당 모듈을 사용하세요.
# cpan -i Lingua::JA::Romanize::Japanese
Lingua::JA::Romanize::Japanese를 사용합니다.
내 $k2r = Lingua::JA::Romanize::Japanese->new;
내 $str = "XX";
"$str의 일본어는 "입니다"라고 말하고, $k2r->chars($str);
인쇄물
XX의 일본어는 도쿄입니다
X 12 : 명백한 인코딩/디코딩
데이터베이스 읽기와 같은 드문 경우, 필요한 인코딩된 텍스트가 제공될 수 있습니다.
풀다.
Encode qw(인코드 디코딩)를 사용합니다.
내 $chars = decode("shiftjis", $bytes, 1);
# 또는
내 $bytes = encode("MIME-Header-ISO_2022_JP", $chars, 1);
동일한 인코딩을 사용하는 모든 스트림의 경우 인코딩/디코딩을 사용하지 마십시오. 대신 파일을 설정하십시오.
나중에 설명하는 대로 파일을 열 때 또는 "binmode"로 바로 인코딩합니다.
아래.
X 13 : 디코드 프로그램 인수 as utf8
$ perl -CA ...
or
$ PERL_UNICODE=A를 내보내세요
or
Encode qw(decode_utf8)를 사용하세요.
@ARGV = 맵 { decode_utf8($_, 1) } @ARGV;
X 14 : 디코드 프로그램 인수 as 장소 부호화
# cpan -i 인코딩::로케일
Encode qw(locale)을 사용합니다.
Encode::Locale을 사용하세요.
# "locale"을 인수로 사용하여 인코딩/디코딩
@ARGV = 맵 { 디코딩(로케일 => $_, 1) } @ARGV;
X 15 : 선언 STD{입력,출력,오류} 에 be utf8
명령줄 옵션이나 환경 변수를 사용하거나 "binmode"를 명시적으로 호출하세요.
$ perl -CS ...
or
$ PERL_UNICODE=S를 내보내세요
or
open qw(:std :utf8);를 사용합니다.
or
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
X 16 : 선언 STD{입력,출력,오류} 에 be in 장소 부호화
# cpan -i 인코딩::로케일
인코딩을 사용하십시오.
Encode::Locale을 사용하세요.
# 또는 binmode 또는 open에 대한 스트림으로
binmode STDIN, ":encoding(console_in)" if -t STDIN;
binmode STDOUT, ":encoding(console_out)" if -t STDOUT;
binmode STDERR, ":encoding(console_out)" if -t STDERR;
X 17 : 확인 파일 I / O 디폴트 값 에 utf8
인코딩 인수 없이 열린 파일은 UTF-8로 저장됩니다.
$ perl -CD ...
or
$ PERL_UNICODE=D를 내보냅니다
or
open qw(:utf8);를 사용하세요.
X 18 : 확인 모든 I / O 그리고 인수 디폴트 값 에 utf8
$ perl -CSDA ...
or
$ PERL_UNICODE=SDA를 내보내세요
or
open qw(:std :utf8);를 사용합니다.
Encode qw(decode_utf8)를 사용하세요.
@ARGV = 맵 { decode_utf8($_, 1) } @ARGV;
X 19 : 엽니다 파일 과 구체적인 부호화
스트림 인코딩을 지정합니다. 이는 인코딩된 텍스트를 처리하는 일반적인 방법이며, 호출하는 것이 아닙니다.
저수준 함수.
# 입력 파일
open(my $in_file, "< :encoding(UTF-16)", "wintext");
OR
내 $in_file, "<", "wintext"를 엽니다.
binmode($in_file, ":encoding(UTF-16)");
전에
내 $line = <$in_file>;
# 출력 파일
open($out_file, "> :encoding(cp1252)", "wintext");
OR
내 $out_file을 엽니다. ">", "wintext");
binmode($out_file, ":encoding(cp1252)");
전에
$out_file "텍스트\n"을 출력합니다.
여기에는 인코딩 외에도 여러 레이어를 지정할 수 있습니다. 예를 들어, 주문
":raw :encoding(UTF-16LE) :crlf"에는 암시적 CRLF 처리가 포함됩니다.
X 20 : 유니 코드 포장
유니코드 대소문자 구분은 ASCII 대소문자 구분과 매우 다릅니다.
uc("헨리 X") # "헨리 X"
uc("tschuess") # "TSCHUeSS" 알림 ss => SS
# 둘 다 사실입니다.
"tschuess" =~ /TSCHUeSS/i # ss 주의 => SS
"XXXXXXX" =~ /XXXXXXX/i # X,X,X가 동일함을 주의하세요
X 21 : 유니 코드 대소 문자를 구분하지 않음 비교
CPAN Unicode::CaseFold 모듈에서도 새로운 "fc" XfoldcaseX 함수를 사용할 수 있습니다.
v5.16은 "/i" 패턴 수정자와 동일한 유니코드 케이스폴딩에 대한 액세스를 허용합니다.
항상 사용됨:
"fc" 기능을 사용하세요. # fc() 함수는 v5.16부터 있습니다.
# 대소문자 구분 없이 정렬
내 @sorted = sort { fc($a) cmp fc($b) } @list;
# 둘 다 사실입니다.
fc("tschuess") eq fc("TSCHUeSS")
fc("XXXXXXX") eq fc("XXXXXXX")
X 22 : 경기 유니 코드 줄 바꿈 순서 in 정규식
유니코드 줄바꿈은 두 문자 CRLF 문자 또는 7개의 세로 문자 중 하나와 일치합니다.
공백 문자. 다른 운영 체제에서 온 텍스트 파일을 처리하는 데 적합합니다.
시스템.
\R
s/\R/\n/g; # 모든 줄바꿈을 \n으로 정규화합니다.
X 23 : 돈을 받아가세요 문자 범주
숫자 코드 포인트의 일반 범주를 찾습니다.
Unicode::UCD qw(charinfo);를 사용합니다.
내 $cat = charinfo(0x3A3)->{카테고리}; # "루"
X 24 : 사용 중지 유니코드 인식 in 내장 문자 클래스
"\w", "\b", "\s", "\d" 및 POSIX 클래스가 Unicode에서 제대로 작동하지 않도록 비활성화합니다.
이 범위 내에서든, 단 하나의 정규식 내에서든.
v5.14을 사용하세요.
re "/a"를 사용하세요.
# 또는
내($num) = $str =~ /(\d+)/a;
또는 "\p{ahex}" 및 "\p{POSIX_Digit"}와 같은 특정 비 유니코드 속성을 사용하세요. 속성
어떤 문자 집합 수정자("/d /u /l /a /aa")가 적용되든 여전히 정상적으로 작동합니다.
X 25 : 경기 유니 코드 속성 in 정규식 과 \피, \P
이것들은 모두 주어진 속성을 가진 단일 코드포인트와 일치합니다. "\p" 대신 "\P"를 사용하세요.
해당 속성이 없는 코드포인트 하나와 일치합니다.
\pL, \pN, \pS, \pP, \pM, \pZ, \pC
\p{Sk}, \p{Ps}, \p{Lt}
\p{알파}, \p{상단}, \p{하단}
\p{라틴어}, \p{그리스어}
\p{script=라틴어}, \p{script=그리스어}
\p{동아시아 너비=넓음}, \p{동아시아 너비=넓음}
\p{줄바꿈=하이픈}, \p{LB=HY}
\p{숫자_값=4}, \p{NV=4}
X 26 : 관습 문자 속성
정규 표현식에서 사용할 사용자 정의 문자 속성을 컴파일 시점에 정의합니다.
# 개인용 문자 사용
하위 In_Tengwar { "E000\tE07F\n" }
if (/\p{In_Tengwar}/) { ... }
# 기존 속성 혼합
하위 Is_GraecoRoman_Title {<<'END_OF_SET'}
+utf8::IsLatin
+utf8::IsGreek
&utf8::제목
세트의 끝
if (/\p{Is_GraecoRoman_Title}/ { ... }
X 27 : 유니 코드 표준화
일반적으로 입력 시 NFD로, 출력 시 NFC로 렌더링합니다. NFKC 또는 NFKD 함수를 사용합니다.
동일한 텍스트를 이미 검색한 경우 검색 시 회수율이 향상됩니다.
이것은 단순히 사전 결합된 호환성 글리프보다 훨씬 더 많은 것을 의미합니다.
표준 결합 클래스에 따라 마크를 재정렬하고 싱글턴을 제거합니다.
Unicode::Normalize를 사용합니다.
내 $nfd = NFD($orig);
내 $nfc = NFC($orig);
내 $nfkd = NFKD($orig);
내 $nfkc = NFKC($orig);
X 28 : 개 심자 비ASCII 유니 코드 숫자
"/a" 또는 "/aa"를 사용하지 않은 경우 "\d"는 ASCII 숫자 이상과 일치하지만 PerlXs
암시적 문자열-숫자 변환은 현재 이러한 변환을 인식하지 못합니다. 다음은 그 방법입니다.
이러한 문자열을 수동으로 변환합니다.
v5.14를 사용하세요. # num() 함수에 필요합니다.
Unicode::UCD qw(num)을 사용합니다.
내 $str = "X와 XXXX와 X와 여기가 있어요";
내 @nums = ();
while ($str =~ /(\d+|\N)/g) { # ASCII만이 아닙니다!
@nums, num($1)을 푸시합니다.
}
"@nums"라고 말하세요; # 12 4567 0.875
문자 이름 qw(:full);을 사용하세요.
내 $nv = num("\N{루미 숫자 1}\N{루미 숫자 2}");
X 29 : 경기 유니 코드 그래 핀 클러스터 in 정규식
프로그래머가 볼 수 있는 X 문자 X는 "/./s"에 의해 일치하는 코드 포인트이지만 사용자가 볼 수 있는
XcharactersX는 "/\X/"에 일치하는 문자소입니다.
# 모음 *및* 결합 부호, 밑줄 등을 찾습니다.
내 $nfd = NFD($orig);
$nfd =~ / (?=[aeiou]) \X /xi
X 30 : 발췌 by 그래 핀 를 받아야 하는 미국 여행자 of by 코드 포인트 (정규식)
# 매치하고 첫 번째 자소 5개를 잡으세요
내($first_five) = $str =~ /^ ( \X{5} ) /x;
X 31 : 발췌 by 그래 핀 를 받아야 하는 미국 여행자 of by 코드 포인트 (구체)
# cpan -i 유니코드::GCString
Unicode::GCString을 사용합니다.
내 $gcs = Unicode::GCString->new($str);
내 $first_five = $gcs->substr(0, 5);
X 32 : 개머리판 현 by 그래 핀
코드 포인트로 역순으로 변환하면 부호가 엉망이 되어 "크렘 브륄레"가 실수로 변환됩니다.
"eelXurb emXerc" 대신 "eelurb emerc"를 사용하세요. 따라서 문자소로 역순으로 바꿔야 합니다. 둘 다
이러한 접근 방식은 문자열이 어떤 정규화 상태에 있든 올바르게 작동합니다.
$str = join("", 역순으로 $str =~ /\X/g);
# 또는: cpan -i Unicode::GCString
Unicode::GCString을 사용합니다.
$str = 역방향 Unicode::GCString->new($str);
X 33 : 끈 길이 in 자소
문자열 "brulee"는 자소가 6개이지만 코드포인트는 최대 8개입니다.
코드 포인트가 아닌 문자소:
내 $str = "brulee";
내 $count = 0;
while ($str =~ /\X/g) { $count++ }
# 또는: cpan -i Unicode::GCString
Unicode::GCString을 사용합니다.
내 $gcs = Unicode::GCString->new($str);
내 $count = $gcs->length;
X 34 : 유니 코드 열 너비 을 통한 인쇄
PerlX의 "printf", "sprintf" 및 "format"은 모든 코드 포인트가 1개의 인쇄 열을 차지한다고 생각하지만
많은 사람들이 0 또는 2를 사용합니다. 여기서 정규화가 아무런 차이를 만들지 않는다는 것을 보여주기 위해 둘 다 인쇄합니다.
형태 :
Unicode::GCString을 사용합니다.
Unicode::Normalize를 사용합니다.
내 @단어 = qw/크렘 브륄레/;
@words = 맵 { NFC($_), NFD($_) } @words;
내 $str (@words)에 대한
내 $gcs = Unicode::GCString->new($str);
내 $cols = $gcs->columns;
내 $pad = " " x (10 - $cols);
str, $pad, " |"를 말해보세요.
}
정규화에 관계없이 올바르게 패딩된다는 것을 보여주기 위해 이것을 생성합니다.
크림 |
크레엑스미 |
브륄레 |
브루엑스렉세 |
X 35 : 유니 코드 대조
숫자 코드 포인트로 정렬된 텍스트는 적절한 알파벳 순서를 따르지 않습니다. UCA를 사용하세요.
텍스트 정렬.
Unicode::Collate를 사용하세요.
내 $col = Unicode::Collate->new();
내 @list = $col->sort(@old_list);
을 참조 유씨소트 편리한 명령줄을 위한 Unicode::Tussle CPAN 모듈의 프로그램
이 모듈에 대한 인터페이스.
X 36 : 사례- 그리고 악센트에 민감하지 않음 유니 코드 종류
대소문자와 부호를 무시하고 다음만 살펴보려면 수준 1의 정렬 강도를 지정합니다.
기본 문자.
Unicode::Collate를 사용하세요.
내 $col = Unicode::Collate->new(level => 1);
내 @list = $col->sort(@old_list);
X 37 : 유니 코드 장소 대조
일부 지역에는 특별한 정렬 규칙이 있습니다.
# v5.12를 사용하거나: cpan -i Unicode::Collate::Locale
Unicode::Collate::Locale을 사용합니다.
내 $col = Unicode::Collate::Locale->new(locale => "de__phonebook");
내 @list = $col->sort(@old_list);
The 유씨소트 위에 언급된 프로그램은 "--locale" 매개변수를 허용합니다.
X 38 : 유튜브 영상을 만드는 것은 "cmp" 일 on 본문 를 받아야 하는 미국 여행자 of 코드 포인트
대신 이것 :
@srecs = 정렬 {
$b->{나이} <=> $a->{나이}
||
$a->{NAME} 명령 $b->{NAME}
} @recs;
이것을 사용하세요:
내 $coll = Unicode::Collate->new();
내 $rec (@recs) {
$rec->{NAME_key} = $coll->getSortKey( $rec->{NAME} );
}
@srecs = 정렬 {
$b->{나이} <=> $a->{나이}
||
$a->{NAME_key} cmp $b->{NAME_key}
} @recs;
X 39 : 사례- 그리고 악센트에 민감하지 않음 비교
코드 포인트 대신 문자별로 유니코드 텍스트를 비교하려면 콜레이터 객체를 사용합니다.
Unicode::Collate를 사용하세요.
내 $es = Unicode::Collate->new(
레벨 => 1,
정규화 => undef
);
# 이제 둘 다 참입니다.
$es->eq("가르시아", "가르시아" );
$es->eq("마르케스", "마르케스");
X 40 : 사례- 그리고 악센트에 민감하지 않음 장소 비교
동일하지만 특정 지역에서만 가능합니다.
내 $de = Unicode::Collate::Locale->new(
로케일 => "de__전화번호부",
);
# 이제 이것은 사실입니다:
$de->eq("tschuess", "TSCHUESS"); # 주의 ue => UE, ss => SS
X 41 : 유니 코드 줄바꿈
유니코드 규칙에 따라 텍스트를 줄로 나눕니다.
# cpan -i 유니코드::줄바꿈
Unicode::LineBreak를 사용합니다.
문자 이름 qw(:full);을 사용하세요.
내 $para = "이것은 매우 긴 문자열입니다." x 20;
내 $fmt = Unicode::LineBreak->new;
$fmt->break($para), "\n"을 인쇄합니다.
X 42 : 유니 코드 본문 in DBM 해시, 전에, 지루한 방법
DBM 해시의 키 또는 값으로 일반 Perl 문자열을 사용하면 와이드 문자가 트리거됩니다.
코드 포인트가 바이트에 맞지 않는 경우 예외가 발생합니다. 수동으로 관리하는 방법은 다음과 같습니다.
번역:
DB_File 사용;
Encode qw(인코드 디코딩)를 사용합니다.
%dbhash, "DB_File", "pathname"을 연결하세요.
# 가게
# $uni_key와 $uni_value가 추상 유니코드 문자열이라고 가정합니다.
내 $enc_key = encode("UTF-8", $uni_key, 1);
내 $enc_value = encode("UTF-8", $uni_value, 1);
$dbhash{$enc_key} = $enc_value;
# 가져오기
# $uni_key가 일반 Perl 문자열(추상 유니코드)을 보유하고 있다고 가정합니다.
내 $enc_key = encode("UTF-8", $uni_key, 1);
내 $enc_value = $dbhash{$enc_key};
내 $uni_value = decode("UTF-8", $enc_value, 1);
X 43 : 유니 코드 본문 in DBM 해시, 전에, 쉽게 방법
HereXs는 번역을 암묵적으로 관리하는 방법입니다. 모든 인코딩과 디코딩이 완료됩니다.
자동으로, 특정 인코딩이 첨부된 스트림과 마찬가지로:
DB_File 사용;
DBM_Filter를 사용합니다.
내 $dbobj = tie %dbhash, "DB_File", "pathname";
$dbobj->Filter_Value("utf8"); # 이게 마법의 부분이에요
# 가게
# $uni_key와 $uni_value가 추상 유니코드 문자열이라고 가정합니다.
$dbhash{$uni_key} = $uni_value;
# 가져오기
# $uni_key는 일반 Perl 문자열(추상 유니코드)을 보관합니다.
내 $uni_value = $dbhash{$uni_key};
X 44 : 프로그램: Rescale과 함께 비즈니스를 가속화하는 방법에 대해 알아보세요. of 유니 코드 대조 그리고 인쇄
다음은 로케일별 정렬, 유니코드 케이싱을 사용하는 방법을 보여주는 전체 프로그램입니다.
그리고 일부 문자가 0열 또는 2열을 차지하는 경우 인쇄 너비를 관리합니다.
한 번에 한 열만 생성됩니다. 다음 프로그램을 실행하면 다음과 같이 깔끔하게 정렬된 결과가 생성됩니다.
출력 :
크렘 브륄레....... X2.00
에클레어............. X1.60
피데우아............. X4.20
햄버거.......... X6.00
하몽 세라노...... X4.45
링귀카........... X7.00
파테............... X4.15
배.............. X2.00
페치............. X2.25
스모르브로드........... X5.75
슈페츨레............ X5.50
소리코............. X3.00
XXXXX.............. X6.50
XXX............. X4.00
XXX............. X2.65
XXXXX......... X8.00
XXXXXXX..... X1.85
XX............... X9.99
XX............... X7.50
v5.14에서 테스트한 프로그램입니다.
#!/usr/빈/환경 펄
# umenu - 유니코드 음식의 정렬 및 인쇄 데모
#
# (필수적이고 점점 더 길어지는 서문)
#
UTF8을 사용하십시오.
로케일 정렬을 위해 v5.14를 사용하세요.
엄격한 사용;
경고를 사용하십시오.
경고 사용 qw(FATAL utf8); # 인코딩 오류를 치명적으로 처리
open qw(:std :utf8);를 사용하세요. # UTF-8에서 선언되지 않은 스트림
charnames qw(:full :short);를 사용하세요. # v5.16에서는 필요하지 않습니다.
# std 모듈
Unicode::Normalize를 사용하세요. # std perl 배포판 v5.8부터
List::Util을 사용하세요 qw(최대); # v5.10부터 std perl 배포판
Unicode::Collate::Locale을 사용하세요. # v5.14부터 std perl 배포판
# cpan 모듈
CPAN에서 Unicode::GCString; #을 사용하세요
# 포워드 데프스
서브 패드($$$);
하위 열 너비(_);
하위 제목(_);
내 %가격 = (
"XXXXX" => 6.50, 자이로 #개
"배" => 2.00, # 음, 배와 같은
"linguica" => 7.00, # 매운 소시지, 포르투갈어
"xorico" => 3.00, # 초리소 소시지, 카탈루냐어
"hamburger" => 6.00, # 버거마이스터 마이스터버거
"에클레어" => 1.60, 디저트, 프랑스
"smorbrod" => 5.75, 샌드위치 #개, 노르웨이
"spaetzle" => 5.50, # 바이에리슈 국수, 작은 참새
"XX" => 7.50, # bao1 zi5, 찐 돼지고기 만두, 만다린
"jamon serrano" => 4.45, # 컨트리 햄, 스페인어
"peches" => 2.25, 복숭아 #개, 프랑스어
"XXXXXXX" => 1.85, # 에클레어와 같은 크림이 들어간 페이스트리
"XXX" => 4.00, # 막걸리, 한국 쌀 와인
"XX" => 9.99, # 초밥, 일본식
"XXX" => 2.65, # 오모치, 떡, 일본식
"크림 브륄레" => 2.00, # 크레마 카탈라나
"fideua" => 4.20, 국수 #개 더, 발렌시아
# (카탈루냐어=fideuada)
"pate" => 4.15, # 거위 간 페이스트, 프랑스어
"XXXXX" => 8.00, # 오코노미야키, 일본식
);
내 $width = 5 + 최대 맵 { colwidth } 키 %price;
# 그래서 아시아적인 것들은 누군가가 순서대로 나오는데요.
# 그 스크립트를 읽는 사람은 걱정하지 않을 것입니다.
# CJK 제품은 JIS X 0208 순서로 정렬됩니다.
내 $coll = Unicode::Collate::Locale->new(locale => "ja");
내 $item ($coll->sort(keys %price))에 대해 {
인쇄 패드(항목 제목, 너비, ".");
printf " X%.2f\n", $price{$item};
}
서브 패드($$$) {
my($str, $width, $padchar) = @_;
$str을 반환합니다. ($padchar x ($width - colwidth($str)));
}
하위 열 너비(_) {
내($str) = @_;
Unicode::GCString->new($str)->columns를 반환합니다.
}
하위 제목(_) {
내($str) = @_;
$str =~ s{ (?=\pL)(\S) (\S*) }
{ ucfirst($1) . lc($2) }xge;
$str을 반환합니다.
}
onworks.net 서비스를 사용하여 perlunicook을 온라인으로 사용하세요