文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 554
阅读 6
收藏 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
*)

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2010/05/06/1729250.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
程序员必须知道的字符集与字符编码详解

在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这 个问题,我虽然能回答一两个出来,但是感觉...

Java小铺
2018/08/21
0
0
Unicode ,UTF-8,assic, gbk, latin1编码

Unicode ,UTF-8,assic, gbk, latin1编码 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合...

xiaocao13140
2018/06/04
0
0
利用html5实现类似微信的手机摇一摇功能,并播放音乐,并且解决中文乱码的问题。

转载了@三井学长:http://blog.csdn.net/david1030/article/details/8229008 转载了@Hello Csn楠!:http://www.cnblogs.com/csn0721/ 1、 deviceOrientation:封装了方向传感器数据的事件,...

Oscarfff
2015/04/02
0
0
ASCII,Unicode,UTF-8,GB2312一些关于编码的理解

字符编码:ASCII,Unicode,UTF-8,GB2312 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。 ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于...

lovedreamland
2012/07/17
0
0
再再谈java乱码:GBK和UTF-8互转尾部乱码问题分析(续)

在《再谈java乱码:GBK和UTF-8互转尾部乱码问题分析》我们分析了,如果从一个UTF-8 的字节序列,经过 的操作,"可能"(与总字节数有关)会破坏数据。结果可能是,损失最后一个"字"。 反过来呢?...

polly
2017/10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Flink 幕后之内存管理

Flink 幕后之内存管理 引言 目前很多大数据处理框架,例如Hadoop、Spark、Storm、Flink等。它们都基于JVM语言开发(java or scala),运行在JVM上。为了加速合并或者排序(基于磁盘的方式通常...

moyiguke
20分钟前
2
0
风起云涌,看云计算如何赋能媒体行业?

在媒体行业的转型升级中,云计算的出现多维度促进了媒体融合,打破传统媒体行业与新媒体的界限和竞争格局,在媒体素材管理、移动端功能演进的过程中扮演着重要角色,颠覆了传统媒体新闻采编、...

七牛云
23分钟前
1
0
Mybatis开发遇到问题汇总

mybatis 中![CDATA[...]] 在今天使用Mybatis的xml文件中写sql语句时写入了一些特殊字符 如 < > & 等,但解析xml文件的时候会被转义,事实上并不希望它被转义,可以使用<![CDATA[ ]]>. 这是XML...

wangwei2134
31分钟前
1
0
参数验证 @Validated 和 @Valid 的区别

来源:blog.csdn.net/qq_27680317/article/details/79970590 整编:Java技术栈(公众号ID:javastack) Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范......

Java技术栈
34分钟前
1
0
JS实现继承的几种方式

前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。那么如何在JS中实现继承呢?让我们拭目以待。 JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: ...

不负好时光
38分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部