Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[15811] Re:UTf8 변환, 한글 글자수
오랑캐꽃 [oranke] 3007 읽음    2016-10-26 21:46
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의 문자열을 만들고 싶습니다.
:
: 방법이 생각나지 않아서요.
:
: 좋은 방법 조언 좀 부탁드립니다.
:
:

+ -

관련 글 리스트
15810 UTf8 변환, 한글 글자수 김시혁 2078 2016/10/26
15811     Re:UTf8 변환, 한글 글자수 오랑캐꽃 3007 2016/10/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.