0

例如德尔福代码

  wchar_IsASCii : array[0..1] of WCHAR ;

  wchar_IsASCii[0] := 'A'   ;
  wchar_IsASCii[1] := 'じ'  ;

如何判断是wchar_IsASCii[0]属于 ASCII 还是wchar_IsASCii[1]不属于 ASCII?

实际上,我只需要知道一个UNICODE char 是否属于ASCII,这就是如何区分WCHAR char 是中文、日文还是ASCII。

4

4 回答 4

1

我不了解 Delphi,但我可以告诉您的是,您需要确定字符在 Unicode 中适合的范围。这是有关在 Unicode 中查找 CJK 字符的链接:Unicode中汉字的完整范围是什么?

除非 Delphi 有一些很好的库来区分中文和日文字符,否则你将不得不自己确定。这是关于如何做到这一点的一个很好的答案: Testing for Japanese/Chinese Characters in a string

于 2013-04-17T04:40:32.007 回答
1

问题是......你所说的 ASCII 是什么意思?原始的 ASCII 标准是 7 位代码,称为Latin1- 它甚至不是一个字节。

然后,如果您带有所谓的“扩展 ASCII”——一个 1 字节的项目——那么它的一半可以紧挨着任何东西。它可以是希腊语在一个机器上,欧洲变音符号在另一个机器上,西里尔字母在第三个......等等。

所以我认为如果你需要的只是测试你是否有 7 位Latin1字符 - 排除法语、德语、西班牙语字母和所有斯堪的纳维亚字母的扩展字符,然后 - 因为 Unicode 被设计为另一个超集,Latin1你需要检查它(0 <= Ord(char-var)) and ($7f >= Ord(char-var))


但是,如果你真的需要告诉语言,如果你认为希腊文和西里尔文有点 ASCII 和日文字母(顺便说一下,有两个,平假名和片假名)不是(或者如果你认为法语和德语或多或少类似于 ASCII,但是俄语不是)您将不得不查看 Unicode Ranges。
http://www.unicode.org/charts/index.html

要附带 32 位codepoint标准UCS4,您可以使用http://docwiki.embarcadero.com/Libraries/XE3/en/System.Character.ConvertToUtf32


旁边有用于 Unicode 的标准 IBM 类,但看起来没有很好的 Delphi 翻译存在有人在 Delphi 中使用过 ICU 吗?


您可以使用 Jedi CodeLib,但它的表格(评论相互矛盾)来自 Unicode 4.1 或 5.0,而不是来自当前的 6.2,尽管对于日语版本 5.0 应该足够了


您还可以使用Microsoft MLang 界面来查询类似 Internet 的字符代码 (RFC 1766)

于 2013-04-17T06:06:10.000 回答
0

通常,一个字符属于 ASCII,如果其代码在 0x0000..0x007F 范围内,请参见http://www.unicode.org/charts/PDF/U0000.pdf。一个新的 Delphi 具有类功能TCharacter.IsAscii,但出于某种奇怪的原因,它被声明为私有。

于 2013-04-17T05:28:46.720 回答
0

ASCII 字符的十进制值小于 127。

但是,除非您使用 1960 年代的电传打字机,否则 ASCII 字符可能还不够。ASCII 字符仅涵盖英文字符。如果您确实需要支持德语、法语、西班牙语、瑞典语等中的元音变音符号、坟墓等“西欧”字符,那么测试 Unicode 字符值 <= 127 是不够的。只要您不需要使用东欧脚本,您就可以测试 char 值 <= 255。

于 2013-04-17T06:00:19.823 回答