是的,我们谈论的是 ASCII 码。我的道歉我不是这里的德尔福开发人员。
7 回答
对于 Delphi 7,我将获得由Virtual Treeview 的作者Mike Lischke 提供的免费 Unicode 库。
该库包含许多往返于 Unicode 的转换函数,因此您可以使用在您的应用程序中最有意义的函数。
或者您可以升级到具有内置编码例程和自己的转换函数库的 Delphi 2009。
让我们把一些事情弄清楚。字符集(charset)和字符编码是两个相关但不同的概念。字符集是与某种整数字符代码相关联的字符的抽象列表。然后是字符编码,它基本上是一种描述字符如何以字节表示的算法。
ASCII既充当字符集又充当编码。它使用 7 位来表示 128 个字符(94 个可打印)。另一方面,Unicode是一个字符集,表示 1,114,112 个代码点。有几种编码可以表示 Unicode 字符串,但最值得注意的是 UTF-8、UTF-16、UTF-16LE 和 UTF-32。换句话说,单个 Unicode 字符可以根据编码以不同的方式表示。
delphi 7如何将unicode字符转换为ascii码?
我认为这个问题可以用两种方式来解释。
我有一些编码的 Unicode 字符串,它只包含 ASCII 可打印字符。如何将字符串转换为 ASCII 编码的字节数组?
我有一些编码的 Unicode 字符串,其中还包括非 ASCII 可打印字符,例如中文字符。如何在不丢失信息的情况下将字符串编码为 ASCII 编码,然后将其解码回原始的 Unicode 字符串?
如果您的意思是第一个,您可以像 Osman 所说的那样将 Unicode 字符串加载到 WideString 中
var
original: WideString;
s: AnsiString;
begin
s := AnsiString(original);
如果你指的是第二种,你需要一个通用的编码算法,比如Base64编码。您可以使用David Barton 的 DCPcrypt v2 Beta 3 中包含的DCPBase64.pas。
这取决于您对转换的定义是什么。如果要将 127 个最低字符映射到等效的 Unicode,可以使用显式转换。但是,如果字符串包含更高的字符,这会产生垃圾。
如果您想要 ë -> e 和 û -> u 之类的映射,您可以编写自己的代码。但请注意,始终存在无法转换的字符。
例如,字母 A 在 unicode 中表示为 U+0041,在 ansi 中表示为 41。因此转换它非常简单,但您必须了解 unicode 字符是如何编码的。最常见的是 UTF-16 和 UTF-8。UTF 16,基本上是每个字符两个字节,但即使这样也过于简单化了,因为一个字符可能有更多字节。UTF-8 听起来好像它意味着每个字符 1 个字节,但可以是 2 或 3。更复杂的是,UTF-16 可以是小端或大端。(U+0041 或 U+4100)。
您的问题没有意义的地方是,例如,如果您想在英语语言环境中将阿拉伯字母 ain U+0639 转换为 ansi。你不能。
“ASCII”是字符到数字的特定映射的名称,但有些人说“ASCII 码”根本不是 ASCII 的意思;他们只想要一个字符的数值,无论当时的映射是什么。该描述是否适用于您?
如果是这样,那么您可以使用Ord
标准函数来获取您拥有的任何 Unicode 字符的 Unicode 代码点值。
var
wc: WideChar;
ws: WideString;
x: Word;
x := Ord(wc);
x := Ord(ws[1]);
但是,如果您真的指的是 ASCII,那么您必须更具体地说明您所考虑的转换类型。
请参阅有关从 Unicode 转换为 ASCII 的相关问题:
一般来说,数十万条目的字符集不能转换为 127 条目的字符集,而不会丢失一些信息或编码方案。
您可以使用http://swissdelphicenter.ch/en/showcode.php?id=1692
中的函数
它使用指定的代码页将 Unicode 字符串转换为 Ansi 字符串。
如果您想使用默认系统代码页(在区域选项中定义为非 unicode 代码页)进行转换,您可以简单地执行以下操作:
var
ws: widestring;
s: string;
begin
s:=string(ws)