UTF-8 문자열의 구조는 위키백과에 잘 정리되어있으니 참고하시구요...
https://ko.wikipedia.org/wiki/UTF-8
델파이 2010 이상이라면 TEncoding 을 사용해 다음과 같이 글자수를 얻을 수 있습니다.
i := TEncoding.UTF8.GetCharCount(TBytes('문자열'));
마침 이전버전의 델파이에서 써먹으려고 만든 코드가 있어 첨부합니다.
type
TUCMask = packed record
mask, val: Byte;
end;
const
UCMaskArr : array [0..3] of TUCMask = (
(mask: $80; val: $00),
(mask: $E0; val: $C0),
(mask: $F0; val: $E0),
(mask: $F8; val: $F0)
);
function UTF8LeadByteLen(aLeadByte: Char): Integer;
var
k: Integer;
b: Byte;
begin
Result := -MAXINT;
b := Ord(aLeadByte);
for k := 0 to 3 do
if b and UCMaskArr[k].mask = UCMaskArr[k].val then
begin
Result := k + 1;
Exit;
end;
end;
function UTF8StrLen(const aUTF8String: String): Integer;
var
i, cur: Integer;
begin
i := 0;
cur := 0;
while (cur >= 0) and (cur < Length(aUTF8String)) do
begin
Inc(i);
Inc(cur, UTF8LeadByteLen(aUTF8String[cur + 1]));
end;
if cur < 0 then
Result := -1
else
Result := i;
end;
김시혁 님이 쓰신 글 :
: 델파이5를 사용하고 있습니다.
:
: 한글,영문 혼용 문자열(UTF8)을 바이트수가 아닌 글자수로 채우려 합니다.
:
: Format('%30s', ['감사합니다.123ABC']);
:
: 위 Format함수는 30바이트 문자열을 만들어주는데,
: 제가 원 하는것은 30 Character의 문자열을 만들고 싶습니다.
:
: 방법이 생각나지 않아서요.
:
: 좋은 방법 조언 좀 부탁드립니다.
:
:
|