2017-01-18 2 views
0

동적 배열에 내용을 복사하지 않고 정적 바이트 배열의 일부에 Tencoding.UTF8.Getstring을 적용하려고합니다. 내가 정적 미리 정의 된 길이의 배열이있는 경우, 구문이 작동하지 않습니다, 그러나tencoding의 getstring을 블록 배열 복사가없는 정적 배열의 일부로 사용하는 방법

stringvar:=Tencoding.utf8.Getstring(dynbytearray,offset,length); 

내가 알 수있는 모든 새 동적 배열을 선언하는 설정입니다 : 배열 동적 인 경우, 내가 사용에는 문제가 없습니다 길이, 바이트를 복사하십시오. 나는 구문 트릭을 놓친 것 같아 불필요한 복사를하는 것을 좋아하지 않는다. "setlength ( newdynarr, 뭐든간에); newdynarr : = @ staticarr [선택적 오프셋]"시도가 실패했습니다. 감사.

+0

어떤 델파이 버전? –

+0

RAD Studio 2010 – miodrag

답변

0

공공 TEncoding.GetString() 메소드는 동적 배열을 지원하지만 대신 TEncoding.GetCharCount()TEncoding.GetChars()의 보호 PByte 과부하를 사용할 수 있습니다, 예를 들면 :

type 
    TEncodingHelper = class(TEncoding) 
    public 
    function GetString(Bytes: PByte; ByteCount: Integer): String; 
    end; 

function TEncodingHelper.GetString(Bytes: PByte; ByteCount: Integer): String; 
begin 
    SetLength(Result, GetCharCount(Bytes, ByteCount)); 
    GetChars(Bytes, ByteCount, PChar(Result), Length(Result)); 
end; 

var 
    S: string; 
begin 
    S := TEncodingHelper(TEncoding.UTF8).GetString(PByte(@arr[index]), ByteCount); 
end; 

또는 :

type 
    TEncodingHelper = class helper for TEncoding 
    public 
    function GetString(Bytes: PByte; ByteCount: Integer): String; 
    end; 

function TEncodingHelper.GetString(Bytes: PByte; ByteCount: Integer): String; 
begin 
    SetLength(Result, Self.GetCharCount(Bytes, ByteCount)); 
    Self.GetChars(Bytes, ByteCount, PChar(Result), Length(Result)); 
end; 

var 
    S: string; 
begin 
    S := TEncoding.UTF8.GetString(PByte(@arr[index]), ByteCount); 
end; 
+0

Thx, 현재 작동합니다 (일반 영어로만 테스트). 내가 지저분한 유니 코드에 문제가 생기면 나중에 조사 할 필요가있을 것이다. – miodrag

0

System.UnicodeFromLocaleChars을 사용할 수 있습니다. 이 같은 예를 들어 :

uses 
    SysUtils, SysConst, Windows; 

function Utf8BytesToString(Bytes: PByte; ByteCount: Integer): string; 
var 
    Len: Integer; 
begin 
    Len := UnicodeFromLocaleChars(CP_UTF8, MB_ERR_INVALID_CHARS, Pointer(Bytes), 
    ByteCount, nil, 0); 
    if (ByteCount>0) and (Len=0) then begin 
    raise EEncodingError.CreateRes(@SNoMappingForUnicodeCharacter); 
    end; 
    SetLength(Result, Len); 
    UnicodeFromLocaleChars(CP_UTF8, MB_ERR_INVALID_CHARS, Pointer(Bytes), 
    ByteCount, Pointer(Result), Len); 
end; 

System.UnicodeFromLocaleChars 기능은 POSIX 시스템에서 Windows에서 MultiByteToWideCharUnicodeFromLocaleChars 랩합니다. TEncoding 클래스는 System.UnicodeFromLocaleChars을 사용하여 해당 변환을 수행합니다. 반대 방향으로 여행 하시려면 System.LocaleCharsFromUnicode입니다.

+0

선언되지 않은 식별자 : 'UnicodeFromLocaleChars'. 아마도 나는 너무 오래된 버전을 사용합니다 (D2010). – miodrag

+0

@miodrag :'UnicodeFromLocaleChars()'와'LocalCharsFromUnicode()'가 XE에서 소개되었습니다. –

+1

@DavidHeffernan : OP가 * UTF-8에서 * UTF-16으로 * 변환 중이므로'MultiByteToWideChar()'를 대신 사용합니다. –