WideChar 到字节?

Posted

技术标签:

【中文标题】WideChar 到字节?【英文标题】:WideChar to Bytes? 【发布时间】:2013-03-01 13:22:21 【问题描述】:

我在这里有一个简单的问题。如何在 Delphi - 7 中将WideChar 转换为 2xByte?我搜索了互联网和***,但没有结果...

【问题讨论】:

【参考方案1】:

David 给了你更好的方式,即,

var
  b1, b2: Byte;
  wc: WideChar;

...

b1 := WordRec(wc).Lo;
b2 := WordRec(wc).Hi;

其他一些选项(只是为了好玩):

b1 := Lo(Word(wc));
b2 := Hi(Word(wc));

b1 := Byte(wc);
b2 := Byte(Word(wc) shr 8);

b1 := PByte(@wc)^;
b2 := PByte(NativeUInt(@wc) + 1)^;

var
  wc: WideChar;
  bytes: WordRec absolute wc;

begin

  // Magic! The bytes are already found in bytes.Lo and bytes.Hi!

【讨论】:

我更愿意将 char 转换为 LoHi 函数参数的本机数据类型,因此我将使用 Lo(Integer(wc));Hi。绝对指令 magic 在我看来是最简单的,但我会使用bytes: array[0..1] of Byte absolute wc;,因为这个问题要求字节,而不是WordRec。 [+1ed] @TLama 你认为 WordRec 的字段是什么类型的?另外,Lo和Hi有点奇怪。它们接受 32 位整数,但忽略最高有效的 16 位。它们是 16 位的遗留问题。 @David,我知道WordRec 的字段是字节,但在我看来它的可读性较差! @TLama 好的,我明白你的意思了。 Hi 和 Lo 成员的优势在于您知道他们在哪个方向。不过,我真的不喜欢那些固有的 Lo 和 Hi 16 位功能。言语太奇怪了。由于隐式类型转换,也容易出错。只是我的看法。 @Andreas 好吧。看起来我应该列出所有不同的方式!【参考方案2】:

有很多方法可以做到这一点。例如,我个人的选择是:

var
  b1, b2: Byte;
  wc: WideChar;

....

b1 := WordRec(wc).Lo;
b2 := WordRec(wc).Hi;

【讨论】:

我不会列举所有其他方法。很想知道有多少真正不同的版本。

以上是关于WideChar 到字节?的主要内容,如果未能解决你的问题,请参考以下文章

delphi ansichar 就是Delphi2010 他的edit编辑框文本是widechar类型也就是 1个字符占2个字节,不管是数字

WideChar 和 AnsiChar 有啥区别?

Delphi中不兼容的char和widechar

Windows 7 上的 WideChar 显示问题

在 Delphi 中将宽字符代码点的十六进制字符串表示形式转换为宽字符

Sting 与 WideString, PChar 与 PWideChar[草稿版]