2013-07-10 3 views
3

변수를 widestring 변수에 저장해야합니다. 하지만 내 텍스트는 UTF8이고 widestring은 UTF8을 지원하지 않으며 일부 중국어 문자로 변환합니다.WIDESTRING의 UTF8 버전

그래서 WIDESTRING의 UTF8 버전이 있습니까?

난 항상 UTF8string를 사용하지만이 경우에 나는 당신이 WideString 변수에 UTF8String 변수를 할당 할 때 WideString

+2

'UTF8Decode'를 호출 하시겠습니까? . –

+0

하나의 버전 태그, 사용중인 버전을 사용하십시오. 유니 코드 델파이를 사용하고있는 것 같습니다. WideString을 사용하는 이유는 무엇입니까? 나는 당신이 그 주제에 관해 읽을 필요가 있다고 생각합니다. Marco의 백서부터 시작하십시오. –

+0

UTF-8은 ** 8 ** 비트 폭이므로 ** 16 ** 비트 'WideString'에 저장하면 불필요한 과도한 작업이됩니다. – OnTheFly

답변

9

을 사용해야합니다, 컴파일러는 자동으로 (델파이 2009 이상에서) 문자열을 디코딩하는 지침을 삽입합니다. 그것은 WideString이 가지고있는 UTF-8을 UTF-16으로 덮고 있습니다. WideString 변수에 중국어 문자가 들어 있으면 UTF-8로 인코딩 된 문자열에 UTF-8로 인코딩 된 중국어 문자가 들어 있기 때문입니다.

var 
    ws: WideString; 
    i: Integer; 
    c: AnsiChar; 

SetLength(ws, Length(s)); 
for i := 1 to Length(s) do begin 
    c := s[i]; 
    ws[i] := WideChar(Ord(c)); 
end; 

경우 :

당신은 당신이 어떤 종류의 캐스팅으로 자동 변환을 바이 패스 할 수 있습니다, 당신의 UTF8Strings에서 바이트의 16 비트 버전을 유지하기 위해 문자열 ws을 원하는 경우 델파이 2009 또는 이후 버전 (XE 시리즈 포함)을 사용하고 있다면 WideString 대신 UnicodeString을 사용해야합니다. 전자는 원시 델파이 형식 인 반면 후자는 Windows BSTR 형식의 래퍼입니다. 두 유형 모두 UTF8String과 같은 AnsiString 파생물에 할당 할 때 자동 변환 동작을 나타냅니다. 따라서 사용 유형을 입력하면이 답변에 영향을 미치지 않습니다.


이전 델파이 버전의 컴파일러는 (UTF-8 결코없는) 시스템 코드 페이지를 사용하여 문자열을 디코딩을 시도한다. 문자열을 제대로 디코딩하도록하려면 Utf8Decode :