文档章节

知道双字节码, 如何获取汉字 - 回复 "pinezhou" 的问题

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 554
阅读 26
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>


问题来源: http://www.cnblogs.com/del/archive/2008/09/05/1284923.html#1818187

{查看同一字符串的双字节码和 UniCode 码}
procedure TForm1.Button1Click(Sender: TObject);
var
  str1: AnsiString;
  str2: UnicodeString; {string = UnicodeString}
  P: PINT;
begin
  { "万一" 对应的双字节码是: BBD2F2CD }
  str1 := '万一';
  P := @str1[1];
  ShowMessage(IntToHex(P^, 4)); //BBD2F2CD {万: F2CD; 一:BBD2 }

  { "万一" 对应的 UniCode 码是: 4E004E07 }
  str2 := '万一';
  P := @str2[1];
  ShowMessage(IntToHex(P^, 4)); //4E004E07 {万: 4E00; 一: 4E00}
end;

{知道双字节码, 如何转换为 UniCode: 两个字一起转}
procedure TForm1.Button2Click(Sender: TObject);
var
  str1: AnsiString;
  str2: string;
begin
  SetLength(str1, 4);
  PInteger(@str1[1])^ := $BBD2F2CD;

  Memo1.Lines.Add(str1); //万一
  str2 := str1;
  Memo1.Lines.Add(str2); //万一
end;

{逐字转}
procedure TForm1.Button3Click(Sender: TObject);
var
  str1: AnsiString;
begin
  SetLength(str1, 2);
  PWord(@str1[1])^ := $F2CD;
  Memo1.Lines.Add(str1); //万
  PWord(@str1[1])^ := $BBD2;
  Memo1.Lines.Add(str1); //一
end;

 
 
 
 
 

 

 

  

好像没有解决问题, 换个思路重来一下:

const
  GB18030 = 54936;
var
  BytesGB18030: TBytes;

{查看 Hex 的函数}
function ToHex(p: PByteArray; b: Integer): string;
var
  i: Integer;
begin
  for i := 0 to b - 1 do
    Result := IntToHex(p^[i], 2) + Chr(32) + Result;
  Result := TrimRight(Result);
end;

{观察字符串以 GB18030 储存的编码}
procedure TForm1.Button1Click(Sender: TObject);
var
  strHex: string;
  StringStream: TStringStream;
begin
  StringStream := TStringStream.Create('万一的 Delphi 博客', GB18030);
  BytesGB18030 := StringStream.Bytes;
  Memo1.Lines.Add(StringStream.DataString);
  Memo1.Lines.Add(ToHex(@BytesGB18030[0], Length(BytesGB18030)));
  Memo1.Lines.Add('');
  StringStream.Free;
end;

{观察字符串以 Unicode 储存的编码}
procedure TForm1.Button2Click(Sender: TObject);
var
  strHex: string;
  StringStream: TStringStream;
begin
  StringStream := TStringStream.Create('万一的 Delphi 博客', TEncoding.Unicode);
  Memo1.Lines.Add(StringStream.DataString);
  Memo1.Lines.Add(ToHex(@StringStream.Bytes[0], Length(StringStream.Bytes)));
  Memo1.Lines.Add('');
  StringStream.Free;
end;

{把从前面测试得到的字节数组 BytesGB18030 转换为 Unicode 字符串}
procedure TForm1.Button3Click(Sender: TObject);
var
  StringStream: TStringStream;
  str,strHex: string;
begin
  if Length(BytesGB18030) < 1 then Exit;

  {直接根据字节数组建立 TStringStream}
  StringStream := TStringStream.Create(BytesGB18030);
  {TStringStream.DataString 就已经是标准的 string}
  str := StringStream.DataString;

  Memo1.Lines.Add(StringStream.DataString);
  Memo1.Lines.Add(ToHex(@StringStream.Bytes[0], Length(StringStream.Bytes)));
  Memo1.Lines.Add('');
  Memo1.Lines.Add(str);
  Memo1.Lines.Add(ToHex(@str[1], ByteLength(str)));
  StringStream.Free;
end;

 
 
 
 
 

 

 

  

(* Memo 中的测试结果:
Memo1
万一的 Delphi 博客
CD BF A9 B2 20 69 68 70 6C 65 44 20 C4 B5 BB D2 F2 CD

万一的 Delphi 博客
5B A2 53 5A 00 20 00 69 00 68 00 70 00 6C 00 65 00 44 00 20 76 84 4E 00 4E 07

万一的 Delphi 博客
CD BF A9 B2 20 69 68 70 6C 65 44 20 C4 B5 BB D2 F2 CD

万一的 Delphi 博客
5B A2 53 5A 00 20 00 69 00 68 00 70 00 6C 00 65 00 44 00 20 76 84 4E 00 4E 07
*)

 
 
 
 
 

 

 

  
涂孟超
粉丝 13
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.6K
8
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
7.3K
8
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1.1K
0
Java™ 编译器--Janino

Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,...

匿名
2013/04/02
4.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

倒计时一周,HOLOS千人大会即将召开!

8月10日消息,Holos霍洛斯星际云自由能源将于2020年8月17日在深圳召开千人媒体发布会。据了解,此次发布会将请到众多行业领袖、区块链技术精英、数十位国家级专科院士以及多位能源行业重量级...

osc_njd5t1rw
26分钟前
17
0
Goroutine 泄露排查

我们在发布一个 go 应用时,默认都会启用两个 http handler: 一个是 pprof,方便线上动态追踪问题;另外一个是 prometheus 的 metrics,这样就可以通过 grafana 准实时的监控当前 runtime 信...

ms2008
2019/06/03
0
0
如何在Python中打印到stderr? - How to print to stderr in Python?

问题: There are several ways to write to stderr: 有几种写stderr的方法: # Note: this first one does not work in Python 3print >> sys.stderr, "spam"sys.stderr.write("spam\n")......

法国红酒甜
27分钟前
9
0
关于JWT Token 自动续期的解决方案

前言 在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个jwt token。前端(如vue)在接收到jwt token后会将token存储到LocalStorage中。 后续每次请求都会将此token放在请...

飘渺Jam
07/16
20
0
5G时代会不会导致编程语言大灭绝,JS的前景是否会更好-诺禾

首先,5G打开了工业互联网的大门,同时5G也会推动一系列技术的发展,包括物联网、大数据、边缘计算、人工智能等等,而这些技术的发展又会推动各种技术平台的发展,从而形成以技术平台为基础来...

osc_jo2m8l1r
28分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部