【问题标题】:How to find if a word has standard ASCII characters?如何查找一个单词是否有标准的 ASCII 字符?
【发布时间】:2019-09-19 14:01:27
【问题描述】:

我使用的是 Delphi Rio 10.3.2,我需要了解一个字符串是否只有 ASCII 字符。

另外,如果它不只包含 ASCII 字符,我需要了解它是否是西里尔文。

我在考虑 unicode 范围..so

这是拉丁语:

https://jrgraphix.net/r/Unicode/0020-007F

这是西里尔文:

https://jrgraphix.net/r/Unicode/0400-04FF

但我不知道如何检查 unicode 范围,也不知道这是否是实现我需要的好方法。

有人可以帮忙吗? 谢谢。

【问题讨论】:

  • 范围不足以涵盖西里尔文。运行 unichars '\p{ScriptExtensions=Cyrillic}' 以查看 Unicode 12.1 的正确结果。为了您的方便,这里复制了代码点 intspan:U+0400…U+052F,U+1C80…U+1C88,U+1D2B,U+1D78,U+2DE0…U+2DFF,U+2E43,U+A640…U+A69F,U+FE2E…U+FE2F

标签: delphi unicode character-encoding


【解决方案1】:

TPerlRegEx 是你的朋友!

如果您以前没有使用过这些,请不要惊慌。

我刚刚找到 this 'SkillSprint' 使用这些 - 我还没有看过它,但它可能对你有帮助。

还有很多在线工具可以帮助您测试您的 RegEx 语法,看看它是否有效。 This link 是我自己用过的一个(有很多可用的)。

function IsJustAscii(Input: String): Boolean
var
  pRegEx: TPerlRegEx;
begin
  pRegEx:=TPerlRegEx.Create;
  pegEx.RegEx:='^[\x20-\x7f]*$';           // Any number (including 0) of ascii characters 
  pRegEx.Subject:=Input;
  pRegEx.Options:=[preSingleLine, preMultiLine];
  Result:=pRegEx.Match;
  FreeAndNil(pRegEx);
end

function ContainsCyrillic(Input: String): Boolean
var
  pRegEx: TPerlRegEx;
begin
  pRegEx:=TPerlRegEx.Create;
  pegEx.RegEx:='[\x{0400}-\x{04ff}]+';    // one or more cyrillic characters
  pRegEx.Subject:=Input;
  pRegEx.Options:=[preSingleLine, preMultiLine];
  Result:=pRegEx.Match;
  FreeAndNil(pRegEx);
end

第一个函数检查整个字符串是否仅包含 Ascii 字符(您可能希望允许换行符、制表符、回车符等)

第二个函数查找字符串中是否有任何个西里尔字符。

【讨论】:

    【解决方案2】:

    逐个遍历字符并检查它们的序数值。例如:

    var
      c: char;
      str: string;
    ....
    str := ...;
    for c in str do
      if InRange(Ord(c), $0020, $007f) then
        // ASCII
    

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 1970-01-01
      • 2012-07-21
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多