2009-01-31 9 views
5

몇 가지 이유 때문에 UTF8String의 원시 바이트 내용을 표시한다고 가정합니다.Delphi 2009 RawByteString vagaries

var 
    utf8Str : UTF8String; 
begin  
    utf8Str := '€ąćęłńóśźż'; 
end; 

(1)은하지 않습니다, 그것은 읽을 수있는 형태가 표시

memo1.Lines.Add(RawByteString(utf8Str)); 
// output: '€ąćęłńóśźż' 

(2)이, 그러나, "작업"않습니다 - 병합주의 :

memo1.Lines.Add('x' + RawByteString(utf8Str)); 
// output: 'x€ąćęłńóśźż' 

나는 UnicodeString에 대한 컴파일러의 강요가 RawByteString var 그대로. 그러나 왜 행동이 (2)에서 바뀌는가? -

(3) 낯선 사람이 아직이 연결 반전하자 : 나는 델파이에서 신기한 것을 좋아하는 캐릭터 유형에 독서와 나는 그들이 어떻게 작동하는지 이해 생각했습니다

memo1.Lines.Add(RawByteString(utf8Str) + 'x'); 
// output: '€ąćęłńóśźżx' 

을하지만,이 퍼즐이다 .

답변

9

RawByteString은 다양한 코드 페이지 유사성을 가진 AnsiString의 다양한 맛을 사용하는 기능에 필요한 과부하 수를 최소화하기 위해서만 존재합니다.

일반적으로 RawByteString 유형의 변수를 선언하지 마십시오. 해당 유형에 값을 유형 변환하지 마십시오. 해당 유형의 변수에 대한 연결을 수행하지 마십시오. 당신이 할 수있는 유일한 것들에 대해 다음과 같습니다

  • 이 유형의 매개 변수 (원래 의도) 등의 매개 변수 이러한 매개 변수에를 확인
  • 지능형 작업을 검색
  • 인덱싱 선언 StringCodePage 함수를 사용하여 문자열의 실제 코드 페이지

예를 들어 StringCodePage 함수 자체는 인수 유형으로 RawByteString을 사용합니다. 이 방법은 인수로 전달하기 전에 코드 페이지 변환을 수행하는 것이 아니라 AnsiString으로 작동합니다.

귀하의 경우, 연결과 같은 것은 크게 정의되지 않습니다. RTM과 Update 2간에 동작이 변경되었지만 RTL 문자열 연결 함수가 다른 코드 페이지로 여러 문자열을받는 경우 최종 문자열에 어떤 코드 페이지를 사용해야하는지 쉽게 판단 할 수 없습니다. 이것이 당신이 여기서 한 것처럼 연결하지 않아야하는 이유 중 하나 일뿐입니다.

+0

Thans, Barry, 그건 좋은 생각입니다.연결은 단지 "이 버튼을 누르면 어떻게 될까?"실험 이었지만 실용적인 가치는 없었습니다. Delphi가 이와 같이 정의되지 않은 동작을 도입한다는 것을 알기는하지만 이상합니다. –

1

"있는 그대로"TMemo에 문자열을 추가 할 수 없습니다. 당신은 항상이기 때문에 모든 잇는 TMemo 대해 알고, 유니 코드로 변환 그래서 어떤 종류의 필요 2009 년

당신이 당신의 UTF8String에 코드 페이지 1252을 사용하는 척하려면 델파이이 수행을 위해

var 
    utf8Str : UTF8String; 
    Raw: RawByteString; 
begin 
    utf8Str := '€ąćęłńóśźż'; 
    Raw := utf8Str; 
    SetCodePage(Raw, 1252, False); 
    Memo.Lines.Add(Raw); 
end; 

을 자세한 내용은 내 기사 참조 Using RawByteString Effectively

+0

UTF-8은 8 비트 인코딩입니다. 코드 단위 $ 00 - $ FF가있는 그대로 처리해야합니다. 그러나 코드 페이지 1252는 코드 단위 $ 80- $ 9F를 UTF-16으로 변환 할 때 다른 값으로 매핑합니다. 대신 코드 페이지 28591 (ISO-8859-1)을 사용해야합니다. –

관련 문제