D2006 프로그램을 D2010으로 변환 중입니다. 데이터베이스의 문자열 당 하나의 바이트에 하나의 값을 저장하고 LoadFromStream이있는 컨트롤에로드해야하므로 내 문자열을 스트림에 쓰고 LoadFromStream과 함께 사용해야합니다. 그러나 그것은 효과가 없었습니다. 이 문제를 연구하면서 AnsiString에서 Unicode 문자열로의 변환이 실제로 어떻게 작동하는지 이해하지 못한다는 것을 알게되었습니다. 다음은 내가 혼란스러워하는 문제를 보여주는 독립 실행 형 코드입니다. AnsiString을 유니 코드 문자열로 변환
procedure TForm1.Button1Click(Sender: TObject); {$O-}
var
sBuffer: String;
oStringStream: TStringStream;
sAnsiString: AnsiString;
sUnicodeString: String;
iSize1,
iSize2: Word;
begin
sAnsiString := '12345';
oStringStream := TStringStream.Create(sBuffer);
sUnicodeString := sAnsiString;
iSize1 := StringElementSize(sAnsiString);
iSize2 := StringElementSize(sUnicodeString);
oStringStream.WriteString(sUnicodeString);
end;
마지막 줄에 중단하고, oStringStream의 바이트 속성을 검사하는 경우
, 당신은 다음과 같습니다 것을 볼 수 있습니다 :Bytes (49 {$31}, 50 {$32}, 51 {$33}, 52 {$34}, 53 {$35}
나는 그것이
처럼 보일 수 있음을 예상하고 있었다(49 {$31}, 00 {$00}, 50 {$32}, 00 {$00}, 51 {$33}, 00 {$00},
52 {$34}, 00 {$00}, 53 {$35}, 00 {$00} ...
분명히 내 기대치가 잘못되었습니다. 그렇다면 AnsiString을 유니 코드로 변환하는 방법은 무엇입니까?
한 번에 스트림에서 2 바이트를 읽으므로 올바른 결과를 얻지 못하고 있지만받는 데이터가 그런 방식으로 정렬되어 있지 않습니다. LoadFromStream에 유니 코드 문자열 기반의 데이터 스트림을 제공하려면 어떻게해야합니까?
도움 주셔서 감사합니다.
나는 의미있는 대답을하기에 충분한 정보가 질문에 있다고 생각하지 않습니다. 변수에는 어떤 유형이 관련되어 있습니까? 이는 컴파일러가 생성 한 코드에서 트리거되는 자동 변환과 관련하여 잠재적으로 중요합니다. 또한 특히 oPayGrid의 유형은 무엇입니까? 이 객체에 sStream 속성이 있으면 표준 VCL 스트림이 아님을 알 수 있습니다. 이상적으로는 문제의 코드 예제가 추가 설명/점에 대한 필요없이 동작을 보여주는 독립 실행 형 예제로 재 작성/확장되었습니다. – Deltics
아오 테아 로아에 우박! 죄송합니다. 나는 도움이되지 않는 세부 사항으로 질문을 혼란스럽게하는 것을 피하려고 노력했다. 나는 내가 너무 성공적이었다고 생각한다. oPaygrid는 클래스 (TObject)입니다. oPaygrid.sStream의 이름이 AnsiString입니다. sUnicodeString은 기본적으로 유니 코드 문자열 인 Delphi 문자열입니다. iSize1과 iSize2는 정수입니다. 내 질문은 주로 개념적입니다. AnsiString을 유니 코드 문자열로 캐스팅 할 때 유니 코드 문자열에 문자 당 2 바이트가 표시되어야합니까? 나는 그것을 보지 못하고 있으며 LoadFromStream으로 내 컨트롤을 성공적으로로드하지 못하게하는 것 같습니다. – jrodenhi
StringElementSize()를 사용하면 안됩니다. 반 이주 된 C++ Builder 모듈에서 코드를 호출하는 경우에만 필요합니다. 할당'sUnicodeString : = sAnsiString'은 문자열의 페이로드를 Char = WideChar로 수정하여 StringElementSize에 대한 호출은 항상 AnsiString의 SizeOf (AnsiChar)를 반환하고 UnicodeString의 SizeOf (Char)를 반환합니다. SizeOf (AnsiChar)/SizeOf (Char)는 훨씬 빠르고 빠르며 읽기 쉽고 이해하기 쉽고 글자가 짧습니다. –