델파이 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로 변환한다 (당신이 표시되지 않았다)를 디버깅/출력된다.
사용 MultiByteToWideChar –
가능성은 파일이 UTF-8로 작성되지 않았기 때문입니다. UTF-8로 작성된 파일은 일반적으로 3 바이트 [바이트 순서 표시 순서] (https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8)를 앞에두고 파일이없는 경우 시스템의 기본 Ansi 코드 페이지를 사용한다고 가정하는 것이 안전합니다. 이 경우 UTF8String에 데이터를 저장하면 UTF-8이 생성되지 않습니다 ... –
코드가 작동하지 않는다고 어떻게 판단 했습니까? WideString을 ANSI로 변환 한 것이 틀림 없습니다. –