导航:
论坛 -> 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单元里面].还是不实现. 希望高手能根据上面给个能实现转换的函数.谢谢.
----------------------------------------------
大家好,我是一个很苯的小孩子,忘大家指教指教。
作者:
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
作者:
2009/11/5 14:03:41
2楼:
我更怀疑的是, LZ一个字节一个字节的打印,想看到 6C 49,但是却看到了 49 6C
----------------------------------------------
-
作者:
no74 (小财)
★☆☆☆☆
-
普通会员
2009/11/5 14:47:56
3楼:
谢谢 upp (wang), 那想通过E6B189 而得到 "汉" 字,要怎么转换呢?
----------------------------------------------
大家好,我是一个很苯的小孩子,忘大家指教指教。
作者:
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. 没事.这点我处理好了.谢谢大家的指导. 好了.此贴结了.非常感谢大家对我的指导.我会努力补足我自己的不足,继续努力学习,再学习. 谢谢大家.
----------------------------------------------
大家好,我是一个很苯的小孩子,忘大家指教指教。
作者:
2009/11/6 12:43:11
10楼:
升级到d2009吧,我的妈妈啊,现在用d7的人都应该升级到d2007!
----------------------------------------------
-