﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-万一的 Delphi 博客</title><link>http://www.cnblogs.com/del/</link><description>记录学习过程中的点点滴滴，是喜欢、不是职业；记性不好，特别需要这么一个博客。</description><language>zh-cn</language><lastBuildDate>Sun, 23 Nov 2008 16:50:19 GMT</lastBuildDate><pubDate>Sun, 23 Nov 2008 16:50:19 GMT</pubDate><ttl>60</ttl><item><title>Byte 数组转字符串 - 回复 "不知道" 问题</title><link>http://www.cnblogs.com/del/archive/2008/11/23/1339604.html</link><dc:creator>万一</dc:creator><author>万一</author><pubDate>Sun, 23 Nov 2008 14:57:00 GMT</pubDate><guid>http://www.cnblogs.com/del/archive/2008/11/23/1339604.html</guid><wfw:comment>http://www.cnblogs.com/del/comments/1339604.html</wfw:comment><comments>http://www.cnblogs.com/del/archive/2008/11/23/1339604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/del/comments/commentRss/1339604.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/del/services/trackbacks/1339604.html</trackback:ping><description><![CDATA[问题来源: <a href="http://www.cnblogs.com/del/archive/2008/11/23/1339323.html#1379150">http://www.cnblogs.com/del/archive/2008/11/23/1339323.html#1379150</a><hr><br>
<pre class=Delphi>
var
  bs: array[0..25] of Byte;
  s: string;
  i: Integer;
begin
  for i := 0 to Length(bs) - 1 do bs[i] := 65+i;
  s := string(StrPas(PAnsiChar(@bs)));
  ShowMessage(s); {ABCDEFGHIJKLMNOPQRSTUVWXYZ}
end;
<hr>
</pre><img src ="http://www.cnblogs.com/del/aggbug/1339604.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43630/" target="_blank">[新闻]Silverlight 2 SDK中文版发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>汉字与多字节编码的转换 - 回复 "不知道" 的问题</title><link>http://www.cnblogs.com/del/archive/2008/11/23/1339323.html</link><dc:creator>万一</dc:creator><author>万一</author><pubDate>Sun, 23 Nov 2008 04:31:00 GMT</pubDate><guid>http://www.cnblogs.com/del/archive/2008/11/23/1339323.html</guid><wfw:comment>http://www.cnblogs.com/del/comments/1339323.html</wfw:comment><comments>http://www.cnblogs.com/del/archive/2008/11/23/1339323.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/del/comments/commentRss/1339323.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/del/services/trackbacks/1339323.html</trackback:ping><description><![CDATA[问题来源: <a href="http://www.cnblogs.com/del/archive/2008/11/22/1284923.html#1378410">http://www.cnblogs.com/del/archive/2008/11/22/1284923.html#1378410</a><hr><br>

Delphi 2009 默认的编码是多字节编码(MBCS), Delphi 这样表示它: TEncoding.Default.<br><br>

下面是多字节编码与汉字之间转换的例子:<hr>
<pre class=Delphi>
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{汉字到多字节编码}
procedure TForm1.Button1Click(Sender: TObject);
var
  stream: TStringStream;
  b: Byte;
  s: string;
begin
  stream := TStringStream.Create('我们', TEncoding.Default);
  s := '';
  for b in stream.Bytes do s := Format('%s%x ', [s,b]);

  ShowMessage(s); {CE D2 C3 C7}
  stream.Free;
end;

{多字节编码到汉字}
procedure TForm1.Button2Click(Sender: TObject);
var
  stream: TStringStream;
begin
  stream := TStringStream.Create;
  stream.Size := 4;
  stream.Bytes[0] := $CE; 
  stream.Bytes[1] := $D2;
  stream.Bytes[2] := $C3;
  stream.Bytes[3] := $C7;

  ShowMessage(stream.DataString); {我们}
  stream.Free;
end;

{把多字节编码的字符串转换到汉字}
procedure TForm1.Button3Click(Sender: TObject);
var
  str: AnsiString;
  stream: TStringStream;
  i: Integer;
begin
  str := 'CED2C3C7';
  stream := TStringStream.Create;
  stream.Size := Length(str) div 2;

  for i := 1 to Length(str) do
    if Odd(i) then
      stream.Bytes[i div 2] := StrToIntDef(Concat(#36,str[i],str[i+1]), 0);

  ShowMessage(stream.DataString); {我们}
  stream.Free;
end;

end.
<hr>
</pre><img src ="http://www.cnblogs.com/del/aggbug/1339323.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43630/" target="_blank">[新闻]Silverlight 2 SDK中文版发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>设置屏幕分辨率的函数 - 回复 "董勇" 的问题</title><link>http://www.cnblogs.com/del/archive/2008/11/19/1336819.html</link><dc:creator>万一</dc:creator><author>万一</author><pubDate>Wed, 19 Nov 2008 09:14:00 GMT</pubDate><guid>http://www.cnblogs.com/del/archive/2008/11/19/1336819.html</guid><wfw:comment>http://www.cnblogs.com/del/comments/1336819.html</wfw:comment><comments>http://www.cnblogs.com/del/archive/2008/11/19/1336819.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.cnblogs.com/del/comments/commentRss/1336819.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/del/services/trackbacks/1336819.html</trackback:ping><description><![CDATA[<br>
<pre class=Delphi>
{函数}
function SetScreen(x,y: Word): Boolean;
var
  DevMode: TDeviceMode;
begin
  Result := EnumDisplaySettings(nil, 0, DevMode);
  if Result then
  begin
    DevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
    DevMode.dmPelsWidth := x;
    DevMode.dmPelsHeight := y;
    Result := ChangeDisplaySettings(DevMode, 0) = DISP_CHANGE_SUCCESSFUL;
  end;
end;

{测试}
procedure TForm1.Button1Click(Sender: TObject);
begin
  SetScreen(1024, 768);
end;
<hr>
</pre><img src ="http://www.cnblogs.com/del/aggbug/1336819.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43629/" target="_blank">[新闻][译稿]微软将 jQuery IntelliSense整合到Visual Studio</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>获取各种编码的识别符</title><link>http://www.cnblogs.com/del/archive/2008/11/19/1336798.html</link><dc:creator>万一</dc:creator><author>万一</author><pubDate>Wed, 19 Nov 2008 08:42:00 GMT</pubDate><guid>http://www.cnblogs.com/del/archive/2008/11/19/1336798.html</guid><wfw:comment>http://www.cnblogs.com/del/comments/1336798.html</wfw:comment><comments>http://www.cnblogs.com/del/archive/2008/11/19/1336798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/del/comments/commentRss/1336798.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/del/services/trackbacks/1336798.html</trackback:ping><description><![CDATA[<br>
下面是常用编码的识别符, 在 Delphi(2009) 中如何获取呢?<br>
Unicode: <b>FF FE</b>; BigEndianUnicode: <b>FE FF</b>; UTF8: <b>EF BB BF</b><hr><br>
<pre class=Delphi>
var
  bs: TBytes;
  b: Byte;
  str: string;
begin
  {只有 Unicode、BigEndianUnicode、UTF8 编码有识别符}
  bs := TEncoding.Unicode.GetPreamble;
  str := '';
  for b in bs do str := Format('%s %x', [str, b]);
  ShowMessage(str); {FF FE}

  bs := TEncoding.BigEndianUnicode.GetPreamble;
  str := '';
  for b in bs do str := Format('%s %x', [str, b]);
  ShowMessage(str); {FE FF}

  bs := TEncoding.UTF8.GetPreamble;
  str := '';
  for b in bs do str := Format('%s %x', [str, b]);
  ShowMessage(str); {EF BB BF}

  {ASCII、UTF7 和 Default(默认编码) 没有识别符}
  bs := TEncoding.ASCII.GetPreamble;
  str := '';
  for b in bs do str := Format('%s %x', [str, b]);
  ShowMessage(str); {无}

  bs := TEncoding.UTF7.GetPreamble;
  str := '';
  for b in bs do str := Format('%s %x', [str, b]);
  ShowMessage(str); {无}

  bs := TEncoding.Default.GetPreamble;
  str := '';
  for b in bs do str := Format('%s %x', [str, b]);
  ShowMessage(str); {无} 
end;
<hr>
</pre><img src ="http://www.cnblogs.com/del/aggbug/1336798.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43629/" target="_blank">[新闻][译稿]微软将 jQuery IntelliSense整合到Visual Studio</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>汉字与区位码(2) - 分析</title><link>http://www.cnblogs.com/del/archive/2008/11/19/1336467.html</link><dc:creator>万一</dc:creator><author>万一</author><pubDate>Wed, 19 Nov 2008 02:41:00 GMT</pubDate><guid>http://www.cnblogs.com/del/archive/2008/11/19/1336467.html</guid><wfw:comment>http://www.cnblogs.com/del/comments/1336467.html</wfw:comment><comments>http://www.cnblogs.com/del/archive/2008/11/19/1336467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/del/comments/commentRss/1336467.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/del/services/trackbacks/1336467.html</trackback:ping><description><![CDATA[<br>
在没有 Uncode 的时代, 用 256 个 ACSII 只是方便了英文, 其他文字怎么办?<br><br>

那时是各自为政的, 譬如中文就有: GB2312-80(国内简体)、Big5(台湾繁体)、HKSCS(香港繁体), 但它们互不兼容.<br><br>

GB2312(1980年) 后来升级到 GBK(1995年), 现在电脑上使用的是 GB18030(2000年), 这个系列是向后兼容的.<br><br>

区位码的概念是在 GB2312 时提出的, GB2312 是一个 94*94 的二维表, 行就是 "区"、列就是 "位", 譬如 "万" 字在 45 区 82 位, 所以 "万" 字的区位码是: 4582.<br><br> 

00-09 区(682个): 是符号、数字、英文字符...制表符等;<br>
10-15 区: 空白, 留待扩展;<br>
16-55 区(3755个): 常用汉字(也有叫一级汉字), 按拼音排序;<br>
56-87 区(3008个): 非常用汉字(也有叫二级汉字), 这是按部首排序的;<br>
88-94 区: 空白, 留待扩展.<br><br>

还有两个概念: 国际码、内码.<br><br>

先转一下话题: 打开记事本输入 "万" 字, 保存(编码选择 ANSI); 然后用二进制编辑器(譬如: UltraEdit) 打开, 会看到: <br>
CD F2, 这就是 "万" 字的内码! <br><br>

那什么又是国际码呢?<br>
咱们的 GB2312 用一个二维表表示了咱们需要的字符, 其他文字可能也是如此; 为了区别, 所以有国际组织规定把咱们的 "区" 和 "位" 分别加上 32(十六进制表示: $20; 二进制表示: 00100000) 作为国际码(那其他文字应该加另外一个不同的数字).<br>
这样我们可以算出(45+32, 82+32):<br>
"万" 字的国际码是 77 114($4D72)<br><br>

不过这还不能在计算机上使用, 因为这样会和早已通用的 ASCII 码混淆(导致乱码), 譬如: 77 是 ASCII 的 "M", 114 是 ASCII 的 "r".<br>
所以又有规定把每个字节的最高位都从 0 换成 1(这之前它们都是 0), 或者说把每个字节(区和位)都再加上 128(十六进制的: $80; 二进制的: 10000000), 从而得到 "机内码", 也就是前面所说的 "内码".<br><br>

总结一下: 从区位码, 区和位分别 +32 得到国际码, 再分别 +128 得到内码;<br>
简化一下: 区位码的区和位分别 +160 即可得到内码, 用十六进制表示: 区位码 + $A0A0 = 内码.<br><br>

验证一下前面从记事本输入得到的 CD F2:<br>
45 + 160 = 205; (205 就是 十六进制的 $CD)<br>
82 + 160 = 242; (242 就是 十六进制的 $F2)<br><br>

这样, 内码的两个字节的最高位就都是 1 了, 另外 ASCII 的(0-254)最高位都是 0, 所以有人也使用这个特点来区别汉字.<br><br>

虽然 Window 2000 开始, 系统已经使用 Uncode 编码了, 其实咱们现在还是使用的这种双字节内码, 这是系统根据我们选择的字符集自动转换的.<br><br>

此时再看前面的函数 <a href="http://www.cnblogs.com/del/archive/2008/11/19/1336444.html">http://www.cnblogs.com/del/archive/2008/11/19/1336444.html</a> 应该不会有困难了.<hr><br>
<img src ="http://www.cnblogs.com/del/aggbug/1336467.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43629/" target="_blank">[新闻][译稿]微软将 jQuery IntelliSense整合到Visual Studio</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>