문제

방금 Delphi 2009를 얻었고 이전에는 유니 코드 문자열로 전환하여 필요한 수정에 대한 기사를 읽었습니다. 대부분 (char)의 크기는 더 이상 1이 보장되지 않는다고 언급됩니다. 그러나 왜 이것이 문자열 조작과 관련하여 흥미로울까요?

예를 들어, ansistring : = 'test'를 사용하고 문자열 (지금 유니 코드)으로 동일한 작업을 수행하면 두 경우 모두에 맞는 길이 () = 4를 얻습니다. 테스트를 거치지 않고 다른 모든 문자열 조작 함수는 같은 방식으로 동작하고 인수가 유니 코드 문자열인지 다른 방법인지 내부적으로 결정합니다.

내가 문자열 조작을한다면 왜 숯의 실제 크기가 나에게 관심을 가질까요? (물론 문자열을 문자열로 사용하고 다른 데이터를 저장하지 않으면)

도움을 주셔서 감사합니다! 홀거

도움이 되었습니까?

해결책

유니 코드와 함께 크기 (Somechar) <> 길이 (Somechar). 본질적으로 a의 길이 크기의 합보다 적습니다. 에스. 당신이 가정하지 않는 한 크기 (char) = 1, 또는 크기 (SOMESTRING [X]) = 1 (둘 다 거짓 지금) 또는 교환을 시도하십시오 바이트S와 함께 S, 당신은 아무런 문제가 없어야합니다. 창의적인 물건을하고있는 곳 바이트s로 s 또는 S, 당신은 사용해야합니다 ANSSISTRING.

(Sizeof (SOMESTRING)는 기본적으로 일부 컴파일러 매직을 가진 포인터이기 때문에 길이가 4입니다.)

다른 팁

사람들은 종종 오래된 델파이 코드에서 캐릭터에서 바이트로 암묵적으로 변환합니다. 예를 들어 스트림에 글을 쓸 때. 스트림에 문자열을 쓰면 쓰기 바이트 수를 지정해야하지만 사람들은 종종 문자 수를 대신 전달합니다. 보다 Chris Bensen 의이 게시물 다른 예를 위해.

사람들이 종종 이러한 암시 적 변환을 만드는 또 다른 방법은 "문자열"을 사용하여 이진 데이터를 저장하는 것입니다. 이 경우 실제로 바이트를 원하지만 데이터 유형은 문자를 기대합니다. D2009가 있습니다 이것에 대한 더 나은 유형입니다.

Delphi 2009를 시도하지는 않았지만 FPC를 사용하여 유니 코드로 천천히 전환하고 있습니다. 아래의 모든 것이 델파이 2009에도 보유하고 있다고 95% 확신합니다.

FPC (유니 코드를 지원할 때)에서 '길이'와 같은 함수가 코드를 고려하도록합니다. 따라서 문자열의 길이를 '인간'이 볼 수있는 길이를 반환합니다. 예를 들어 - 중국어가있는 경우, 유니 코드에서 두 바이트의 메모리를 가져 오는 경우, 문자열에는 두 개의 문자가 있기 때문에 길이는 2를 반환합니다. 그러나 문자열은 4 바이트의 메모리가 필요합니다. (+참조 수와 주요 #0에 대한 메모리이지만 옆으로)

더 이상 할 수없는 것은 다음과 같습니다.

var p : pchar;
begin
  p := s[1];
  for i := 0 to length(string)-1 do
    begin
    write(p);
    inc(p);
    end;      
end;

이 코드는 두 개의 중국 문자 예제에서 잘못된 두 문자를 작성하기 때문입니다. 즉, 첫 번째 '실제'문자의 일부인 두 바이트.

간단히 말해서 : length ()는 더 이상 문자열에 할당 된 바이트 양을 반환하지 않고 문자 양을 반환하지 않습니다. (유니 코드로 전환하기 전에이 두 값은 서로 동일했습니다)

바이트 레벨에서 조작을하지 않는 한 캐릭터의 실제 크기는 중요하지 않습니다.

(물론 문자열을 문자열로 사용하고 다른 데이터를 저장하지 않으면)

그것이 핵심 요점입니다. 당신은 다른 목적으로 줄을 사용하지 않지만 어떤 사람들은 그렇게합니다. 그들은 어레이처럼 문자열을 사용하므로 (그리고 나와 포함하는 것은) 아무것도 깨지지 않도록 모든 용도를 확인해야 할 것입니다 ...

이 변환이 실제로 원하지 않는 경우가 있다는 것을 잊지 마십시오. 예를 들어 레코드에 안내서를 저장한다고 말하십시오. 이 안내에는 16 진 문자와 브래킷이 포함될 수 있습니다. 간단한 솔루션은이를 인사로 변경하고 문자열 조작을 수행하는 경우 컴파일러 경고를 처리하는 것입니다.

Windows API 호출을하는 경우 문제가 될 수 있습니다. 또는 레거시 코드가있는 경우 Inc 또는 12 월str [0 길이를 변경합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top