2017-10-04 10 views
2

델파이 6을 사용 중입니다.Delphi 6에서 UTF-8 포르투갈어를 WideString으로 변환 할 수 있습니까?

포르투갈어 UTF-8로 인코딩 된 문자열을 WideString으로 디코드하려고하는데 올바르게 디코딩되지 않는 것으로 나타났습니다.

원래 텍스트는 "ANÁLISE8"입니다. UTF8Decode()을 사용한 후 결과는 "ANALISE8"입니다. "A" 상단의 기호가 사라집니다.

var 
    f : textfile; 
    s : UTF8String; 
    w, test : WideString;  
begin 
    while not eof(f) do 
    begin 
    readln(f,s); 
    w := UTF8Decode(s); 

가 어떻게 제대로 WideString에 포르투갈 UTF-8 문자열을 디코딩 할 수 있습니다 여기에

코드인가?

+0

사용 MultiByteToWideChar –

+0

가능성은 파일이 UTF-8로 작성되지 않았기 때문입니다. UTF-8로 작성된 파일은 일반적으로 3 바이트 [바이트 순서 표시 순서] (https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8)를 앞에두고 파일이없는 경우 시스템의 기본 Ansi 코드 페이지를 사용한다고 가정하는 것이 안전합니다. 이 경우 UTF8String에 데이터를 저장하면 UTF-8이 생성되지 않습니다 ... –

+0

코드가 작동하지 않는다고 어떻게 판단 했습니까? WideString을 ANSI로 변환 한 것이 틀림 없습니다. –

답변

2

델파이 6에서 UTF8Decode()의 구현이 불완전합니다. 특히 U+FFFF 위의 유니 코드 코드 포인트를 처리하는 데 필요한 인코딩 된 4 바이트 시퀀스는 지원하지 않습니다. 즉, UTF8Decode()은 전체 유니 코드 레퍼토리가 아니라 UCS-2 범위의 유니 코드 코드 포인트 만 디코딩 할 수 있습니다. 따라서 UTF8Decode()을 기본적으로 Delphi 6에서 쓸모 없게 만드는 것 (그리고 Delphi 2007까지 모든 방법이 드디어 Delphi 2009에서 수정되었습니다).

대신 Win32에서 MultiByteToWideChar() 기능을 사용해보십시오 예 :

말했다되고 그건
uses 
    ..., Windows; 

function MyUTF8Decode(const s: UTF8String): WideString; 
var 
    Len: Integer; 
begin 
    Len := MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(s), Length(s), nil, 0); 
    SetLength(Result, Len); 
    if Len > 0 then 
    MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(s), Length(s), PWideChar(Result), Len)); 
end; 

var 
    f : textfile; 
    s : UTF8String; 
    w, test : WideString; 
begin 
    while not eof(f) do 
    begin 
    readln(f,s); 
    w := MyUTF8Decode(s); 

, 당신의 ANÁLISE8 문자열이 UCS-2 범위에, 그래서 델파이 6 UTF8Decode()을 시험하고는 UTF-8을 디코딩 인코딩 된 형태는 ANÁLISE8입니다. ,

  • 당신의 UTF8String 변수는 UTF-8 (바이트 시퀀스 41 4E C3 81 4C 49 53 45 38)로 시작하는 ANÁLISE8의 인코딩 된 형태를 포함하지 않으며, 대신에 대신 (바이트 순서 41 4E 41 4C 49 53 45 38을)를 ASCII 문자열 ANALISE8이 포함되어 그 중 하나 결론을 내릴 것 ASCII는 UTF-8의 서브 세트이므로 그대로 디코드합니다. 파일을 두 번 확인하고 출력은 Readln()입니다. 당신의 WideString

  • 예상대로 제대로 ANÁLISE8 포함되어 있지만 방법 당신은 변환하는 동안 Á을 잃고, ANSI로 변환한다 (당신이 표시되지 않았다)를 디버깅/출력된다.

+0

@DavidHeffernan : 대답을 업데이트했습니다. –

+0

@DavidHeffernan : 답변을 업데이트했습니다. –

+0

안녕하세요, 대단히 감사합니다. UTF-8 코드를 16 진수로 변환하고 (바이트 시퀀스 41 4E C3 81 4C 49 53 45 38) 그래서 파일이 UTF-8 형식이어야한다고 생각합니다 ... MyUTF8Decode 함수를 사용해 주셔서 감사합니다. UTF8Decode 대신 사용했으며 결과는 동일합니다. 포르투갈어 문자는 영어로 바뀝니다. –