DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xieqiongxi1
今日帖子: 0
在线用户: 4
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 no74 (小财) ★☆☆☆☆ -
普通会员
2009/11/5 10:34:46
标题:
UTF-8 与 Unicode 之间转换? 浏览:5548
加入我的收藏
楼主: UTF-8
    这是为传输而设计的编码,其系列还有UTF-7和UTF-16
    其中UTF-16和Unicode编码大致一样, UTF-8就是以8位为单元对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
     Unicode编码(16进制)      UTF-8 字节流(二进制) 
     0000 - 007F         0xxxxxxx 
     0080 - 07FF         110xxxxx 10xxxxxx 
     0800 - FFFF         1110xxxx 10xxxxxx 10xxxxxx

  例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。
    将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

我根据上面调用了
  Utf8ToUnicode(), UnicodeToUtf8() [这些函数system单元里面] . 都不能正确得到相应的unicdoe = 6C49 , utf8 = E6B189. 望有知道这方面的高手帮忙一下.

  我在网上还有看到 
Utf8ToUnicode就是将utf8编码的字符串转成UniCode码,相当于Utf8Encode将Utf8编码转成String。
UnicodeToUtf8就是将UniCode码转成utf8编码的字符串,相当于Utf8Decode将String转成Utf8编码。

但是还是一样调用Utf8Encode, Utf8Decode [也在system单元里面].还是不实现.
希望高手能根据上面给个能实现转换的函数.谢谢.
----------------------------------------------
大家好,我是一个很苯的小孩子,忘大家指教指教。
作者:
男 adamwu (AdamWu) ★☆☆☆☆ -
普通会员
2009/11/5 13:55:59
1楼: UTF之所以叫UTF, 就是因为它是为了传输(特别是跨系统传输)设计的。所以有一个特点就是字节的顺序是固定的。
而Unicode本身,因为仅仅是一个符号的编号,因此在不同的系统上有不同的表示方法。

“汉”的Unicode编码是6C49
那么在Intel等Little Endian的机器上,储存下来就是49 6C;
在PowerPC等Big Endian的机器上,储存下来是6C 49

但是翻译成UTF-8以后,储存下来则都是E6 B1 89
----------------------------------------------
-
作者:
男 upp (wang) ★☆☆☆☆ -
盒子活跃会员
2009/11/5 14:00:38
1楼: 楼主对Delphi的字符串处理不了解,自己解析错了代码才导致错误结果的。我这里测试结果完全正常。全部代码如下:

procedure TForm1.Button1Click(Sender: TObject);

  function StrToHex(const S: string): string; overload;
  var
    I: Integer;
  begin
    Result := '';
    for I := 1 to Length(S) do
      Result := Result + IntToHex(Ord(S[I]), 2);
  end;

    function StrToHex(const S: WideString): string; overload;
  var
    I: Integer;
  begin
    Result := '';
    for I := 1 to Length(S) do
      Result := Result + IntToHex(Ord(S[I]), 2);
  end;

var
  s: WideString;
  us: string;
begin
  s := '汉';
  ShowMessage(Format('%s=%s', [s, StrToHex(s)]));
  us := UTF8Encode(s);
  ShowMessage(Format('%s=(utf8)%s', [s, StrToHex(us)]));
end;
----------------------------------------------
          ┃  ┏┃┃┃┏┛
          ┃  ┃┃┃┃┏┛
          ━┛━┛━┛━┛delphi
作者:
男 adamwu (AdamWu) ★☆☆☆☆ -
普通会员
2009/11/5 14:03:41
2楼: 我更怀疑的是, LZ一个字节一个字节的打印,想看到 6C 49,但是却看到了 49 6C
----------------------------------------------
-
作者:
男 no74 (小财) ★☆☆☆☆ -
普通会员
2009/11/5 14:47:56
3楼: 谢谢 upp (wang), 那想通过E6B189 而得到 "汉" 字,要怎么转换呢?
----------------------------------------------
大家好,我是一个很苯的小孩子,忘大家指教指教。
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2009/11/5 14:57:26
4楼: 用Delphi2010
var
  s : AnsiString;
begin
  Button1.Caption := #$6C49 + WideChar($6C49);   //两个方式
  ShowMessage(Format('"%s"内码%x',['汉',WORD('汉')]));
  SetLength(s,4);
  UnicodeToUtf8(PAnsiChar(s),'汉',4);
  ShowMessage(Format('"汉"内码%x%x%x',[Byte(s[1]),Byte(s[2]),Byte(s[3])]));
end;
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 no74 (小财) ★☆☆☆☆ -
普通会员
2009/11/5 15:03:07
5楼: 我是想知道E6B189 ,如何转成6C49, 然后在通过对6C49进行解码.文字
----------------------------------------------
大家好,我是一个很苯的小孩子,忘大家指教指教。
作者:
男 james_ (james_) ★☆☆☆☆ -
盒子活跃会员
2009/11/5 23:07:23
6楼: procedure TForm1.btn1Click(Sender: TObject);
var
  s, ss: string;
  ws: WideString;
  p: PAnsiChar;
  i: Integer;
begin
  SetLength(s, Length(edt1.Text) div 2);
  HexToBin(PAnsiChar(edt1.Text), @s[1], Length(s));
  ws := UTF8Decode(s);
  p := @ws[1];
  SetLength(ss, Length(ws) * 4);
  BinToHex(p, @ss[1], Length(ss));
  edt2.Text := ws + ss;
end;
这样?
但是我这个ss得到的是496C,自己处理一下就好了
----------------------------------------------
-
作者:
男 no74 (小财) ★☆☆☆☆ -
普通会员
2009/11/6 9:59:09
8楼: to james 

   我把upp 和你的源码结合在一起就不会出现相反的496C. 

如下:

procedure TForm1.Button9Click(Sender: TObject);
  function StrToHex(const S: WideString): string; overload;
  var
    I: Integer;
  begin
    Result := '';
    for I := 1 to Length(S) do
      Result := Result + IntToHex(Ord(S[I]), 2);
  end;
var
  s, ss: string;
  ws: WideString;
  p: PAnsiChar;
begin
  SetLength(s, Length(Memo2.Text) div 2);
  HexToBin(PAnsiChar(Memo2.Text), @s[1], Length(s));
  ws := UTF8Decode(s);

  //..........unicode 相反
  {p := @ws[1];
  SetLength(ss, Length(ws) * 4);
  BinToHex(p, @ss[1], Length(ss)); }
  //..........

  Memo4.Text := ws + '   '+ StrToHex(ws);
end;

谢谢大家.
----------------------------------------------
大家好,我是一个很苯的小孩子,忘大家指教指教。
作者:
男 no74 (小财) ★☆☆☆☆ -
普通会员
2009/11/6 9:59:54
9楼: 谢谢, james. 没事.这点我处理好了.谢谢大家的指导.

好了.此贴结了.非常感谢大家对我的指导.我会努力补足我自己的不足,继续努力学习,再学习. 谢谢大家.
----------------------------------------------
大家好,我是一个很苯的小孩子,忘大家指教指教。
作者:
男 softbug (softbug) ★☆☆☆☆ -
普通会员
2009/11/6 12:43:11
10楼: 升级到d2009吧,我的妈妈啊,现在用d7的人都应该升级到d2007!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行69.82422毫秒 RSS