首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Delphi 7中获取字符值

在Delphi 7中获取字符值
EN

Stack Overflow用户
提问于 2013-12-03 09:43:32
回答 3查看 3.3K关注 0票数 0

我正在用Delphi 7编写一个程序,它应该将unicode字符串编码成html实体字符串。例如,"ABCģķī“将导致"ABCģķī

现在有两件基本的事情:

  1. Delphi 7不是unicode,所以我不能直接在代码中编写unicode字符来对它们进行编码。
  2. 代码页由255个条目组成,每个条目都包含一个特定于该代码页的字符,除前127个外,每个条目对所有代码页都是相同的。

所以-我如何得到一个字符的值,即在1-255范围内?

我尝试了Ord(Integer),但它还返回值超过255的方式。基本上,一切都很好(A返回65 a a等等),直到我的字符串到达非拉丁unicode为止。

还有其他方法来返回char值吗?感谢你的任何帮助

EN

回答 3

Stack Overflow用户

发布于 2013-12-03 09:51:37

我建议你避免使用像瘟疫这样的代码。

对于Unicode,我会考虑两种方法: WideString和八号。

宽字符串的优势在于它是Windows的“本机”,这有助于您使用Windows调用。缺点是存储空间,它们(如UTF-8)可能需要多个WideChars来编码完整的Unicode空间。

.=‘8’>一般更可取。与WideStrings一样,这是一种多字节编码,因此一个特定的unicode‘代码点’可能需要字符串中的几个字节来对其进行编码。这只是一个问题,如果您正在对您的字符串进行大量的逐字符处理。

@DavidHeffernan评论(正确无误)指出,在某些情况下,WideStrings可能更紧凑。然而,我只推荐UTF-16,只有当您绝对确信您的编码文本真的会更加紧凑(不要忘记标记!),而且这种紧凑性对您非常重要。

票数 1
EN

Stack Overflow用户

发布于 2013-12-04 02:23:22

在HTML 4中,数字字符引用相对于HTML使用的字符集。不管该字符集是通过<meta>标记在HTML本身中指定的,还是通过HTTP/MIME Content-Type头或其他方式指定的,这都无关紧要。因此,只有当"ABC&#291;&#311;&#299;"使用UTF-16时,"ABCģķī"才能准确地表示"ABCģķī"。如果HTML使用的是UTF-8,则正确的表示形式应该是"ABC&#196;&#163;&#196;&#183;&#196;&#171;""ABC&#xC4;&#xA3;&#xC4;&#xB7;&#xC4;&#xAB;"。大多数其他字符集不支持这些特定的Unicode字符。

在HTML 5中,数字字符引用包含原始Unicode代码点值,而不考虑HTML使用的字符集。因此,"ABCģķī"将表示为"ABC#291;&#311;&#299;""ABC&#x0123;&#x0137;&#x012B;"

因此,要回答您的问题,您必须做的第一件事是决定是否需要对数字字符引用使用HTML 4或HTML 5语义。然后,需要将Unicode数据分配给WideString (Delphi7本机支持的惟一Unicode字符串类型),它使用UTF-16,然后:

  1. 如果您需要HTML 4: 答:如果HTML不是UTF-16,那么使用WideCharToMultiByte() (或等效的)将WideString转换为该字符集,然后循环遍历结果值,输出保留值的非保留字符和字符引用,使用IntToStr()作为十进制表示法或IntToHex()作为十六进制表示法。 如果HTML是UTF-16,那么只需循环遍历WideString中的每个WideString,输出保留值的非保留字符和字符引用,使用IntToStr()作为十进制表示法或IntToHex()作为十六进制表示法。
  2. 如果您需要HTML 5: 答:如果WideString不包含任何代理项对,那么只需循环遍历WideString中的每个WideChar,输出保留值的非保留字符形式和字符引用,使用IntToStr()作为十进制表示法,使用IntToHex()表示十六进制表示法。 否则,使用WideStringWideStringToUCS4String()转换为UTF-32,然后循环遍历结果值,输出保留代码点的非保留代码点和字符引用,十进制表示法使用IntToStr()或十六进制表示法使用IntToHex()
票数 1
EN

Stack Overflow用户

发布于 2013-12-03 12:46:06

如果我正确理解了操作,我就把这个留在这里。

代码语言:javascript
运行
复制
function Entitties(const S: WideString): string;
var
  I: Integer;
begin
  Result := '';
  for I := 1 to Length(S) do
  begin
    if Word(S[I]) > Word(High(AnsiChar)) then
      Result := Result + '#' + IntToStr(Word(S[I])) + ';'
    else
      Result := Result + S[I];
  end;
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20347587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档