2010-06-03 4 views
1

모든 라틴어 -1 문자를 하나씩 출력하는 스크립트를 작성할 수 없습니다. 내가 어떻게 해?모든 CP1252 문자를 하나씩 인쇄하는 방법은 무엇입니까?

아래 코드를 사용하고 있지만 결과가 좋지 않습니다. 007F 후 모든 코드 포인트를 들어

0065 - e 
0066 - f 
... 
... 
007F - character at the step 

, 그것은 나에게 예상되는 결과를 제공하지 않습니다 :

foreach $char(0..255) { 
    $hexval = sprintf("%x",$char); 
    $charval = sprintf("%c",%hexval); 
    print "$charval"; 
} 

출력과 같이해야한다.

답변

2
foreach (0..255) { 
    $hexval = sprintf("%x",$_); 
    $charval = sprintf("%c",$_); 
    print "$_ => $hexval -> $charval\n"; 
} 
0

use strict은 원인에 대한 좋은 단서를 제공했을 것입니다. 당신이 %hexval에 대한 값을 설정하지 않는 그러나 귀하의 예제의 3 행에서 당신은 당신이 아마 $hexval을, 표준,

$charval = sprintf("%c",%hexval); 

있습니다. 두 번째 버그입니다. 원래 값 $char의 서식이 지정된 16 진수 값이 아닌 서식을 지정하려고합니다.

$charval = sprintf("%c", $char); 

이것은 두 번째 라인 unnessisary을하고 코드

use strict; 
for my $char (0..255) { 
    printf "%c\n", $char; 
} 
4

귀하의 질문 제목 당신은 당신이 "라틴어 싶은 말은 당신의 질문의 본문에 다음"CP1252 "하지만 원하는 말한다 단순화 할 수있다 -1". CP1252와 Latin-1은 같은 것이 아닙니다. CP1252는 Latin-1을 기반으로하지만 Microsoft가 유용하지 않은 문자 중 일부는 다른 문자로 대체 한 Microsoft 인코딩입니다.

예를 들어 CP1252에서 0x93은 왼쪽 큰 따옴표 (")이지만 Latin-1에서는 인쇄 할 수없는 제어 코드입니다.

Perl의 내부 인코딩은 (거의는 아니지만) UTF-8입니다. 당신은 CP1252 바이트를 가지고 같은 펄의 UTF-8 문자열 포맷으로 변환 할 수 있습니다 : CP1252에

use Encode qw(decode); 

my $char = decode("CP1252", "\x80"); 

문자 0x80으로는 유로 기호입니다. 유니 코드에서 유로 기호는 U + 20AC입니다. 이제 $ char는 "\ x {20AC}"로 설정됩니다.

다음 문제는 문자를 "인쇄"하고 싶다는 것입니다. 그것은 많은 것을 의미 할 수 있습니다. 문제는 Perl의 내부 문자 표현을 출력 장치가 기대하는 인코딩으로 변환해야한다는 것입니다.

예를 들어 내 리눅스 터미널 창은 그래서는 유로 문자를 인쇄하기 위해 다음을 수행 할 UTF-8을 표시 행복 : 윈도우에서 작동하지 않을 것입니다

binmode(STDOUT, ':utf8'); 

print $char, "\n"; 

비록 명령 프롬프트.

HTML 출력을 생성하는 경우 UTF-8을 작성하고 적절한 헤더로 인코딩을 선언해야합니다. 지난 10-15 년 동안 출시 된 거의 모든 브라우저에서 작동합니다.

관련 문제