2016-09-23 9 views
8

순진한 Perl 6 프로그램은 유니 코드와 관련하여 왕복 안전하지 않습니다.유니 코드 데이터에 대해 Perl 6을 왕복으로 안전하게 만들 수있는 방법은 무엇입니까?

$ perl -CO -E 'say "e\x{301}"' | perl6 -ne '.say' | perl -CI -ne 'printf "U+%04x\n", ord for split //' 
U+00e9 
U+000a 

나는이 문제에 대한 아무것도 볼 수없고, 나는 그것이 매우 충격 찾을 문서를 통해 파고 : 그것은 내부적으로 str을 유형에 대한 정규화 양식 구성 (NFC)를 사용하는 것처럼 나타납니다.

$ perl -CO -E 'say "e\x{301}"' | perl6 -e 'while (my $byte = $*IN.read(1)) { $*OUT.write($byte) }' | perl -CI -ne 'printf "U+%04x\n", ord for split //' 
U+0065 
U+0301 
U+000a 

안전하게 펄 6 라운드 트립으로 모든 텍스트 파일을 NFC에 있어야합니까 : 나는 당신이 왕복 텍스트로 다시 바이트 수준으로 떨어 필요가 믿을 수 없어? 문서가 NFD에 있어야한다면 어떻게 될까요? 여기에 뭔가 빠져 있어야합니다. 나는 이것이 의도적 인 행동이라고 믿을 수 없다.

+1

나는 생각합니다. 'perl6'의 모든 문자열은 NFC 형식으로 처리 된 다음 내부적으로 NFG 형식으로 저장됩니다.이 형식은 미리 작성되지 않은 graphemes를 올바르게 처리하는 'perl6'방식입니다. 관련 http://unix.stackexchange.com/a/311280/38906. 적어도 "Str.ords"는 이것에 대해 언급했다 https://docs.perl6.org/type/Str#method_ords – cuonglm

+0

그것은 나에게 광기가 보인다. 내가 구문에 대한 모든 변경 사항을 처리 할 의향이 있었지만, 귀하의 존재 이유가 문자열 처리 (특히 유니 코드 문자열 처리) 일 때 텍스트 파일을 왕복시킬 수는 없다는 것은 어리석은 일입니다. –

답변

5

대답은 Uni 유형 (NFD, NFC 등의 기본 클래스)을 사용하는 것으로 보이지만 실제로는 그렇게하지 않으며 파일을 Uni 문자열로 가져 오는 좋은 방법이 없습니다. 따라서 앞으로 이름이 명시되지 않은 지점까지는 정규화되지 않은 파일을 바이트로 처리하지 않으면 라운드 트립 할 수 없습니다.

+0

"좋은 방법"이란 무엇을 의미합니까? – zostay

+0

@zostay Buf로 블록을 읽지 않고 UTF-8 파서를 사용하는 방법은 Uni로 변환하기 위해 직접 작성해야합니다 (내장 된 NFC가 적용됩니다). 좋은 방법은'$ * IN.lines (: Uni)'와 같은 것이다. –

+0

문제는 Str 및 Str 관련 항목이이 시점에서 "줄"을 이해한다는 것입니다. 내가 생각할 수있는 가장 가까운 것은'$ * IN.Supply (: bin) .map ({Uni.new (.list)})'와 같은 것이고 그 다음 줄을 긋아야한다. 그것은 추한 부분이된다. – zostay

2

UTF8-C8을 사용하십시오. documentation에서 :

당신은 그들이 디스크에 으로 정확한 바이트를 읽을 수있는 파일 핸들과 UTF8-C8를 사용할 수 있습니다. 을 UTF8 핸들을 사용하여 인쇄하면 인쇄 할 때 재미있어 보일 수 있습니다. 출력이 UTF8-C8 인 핸들에 인쇄하면 보통 예상대로 으로 렌더링되며 바이트 정확한 복사를위한 바이트가됩니다.

+0

UTF8-C8은 실제로 좋은 솔루션은 아닙니다 (하지만 현재 유일한 해결책 일 것입니다).e와 acute에 대한 코드 포인트는 "e \ x [10FFFD] xCCx \ x [10FFFD] x81"로 저장됩니다 (즉, U + 10FFFD 앞에 x가있는 16 진수의 UTF-). 또한 명시 적으로 UTF8-C8을 사용하여 문자열을 출력해야합니다. 그렇지 않으면 acute를 결합하는 것보다 더러운 엉망이 작성됩니다. 모든 결합 acute가 영향을받는 것은 아니며, NFC 양식을 가진 캐릭터에 부착 된 것 (예 : acute를 결합한 x는 정상적으로 저장 됨)에만 유의하십시오. –

+0

참고 : https://www.youtube.com/watch?v=_zJ-2VXpUyM –