我正在用Delphi 7编写一个程序,它应该将unicode字符串编码成html实体字符串。例如,"ABCģķī“将导致"ABCģķī”
现在有两件基本的事情:
所以-我如何得到一个字符的值,即在1-255范围内?
我尝试了Ord(Integer),但它还返回值超过255的方式。基本上,一切都很好(A返回65 a a等等),直到我的字符串到达非拉丁unicode为止。
还有其他方法来返回char值吗?感谢你的任何帮助
发布于 2013-12-03 09:51:37
我建议你避免使用像瘟疫这样的代码。
对于Unicode,我会考虑两种方法: WideString和八号。
宽字符串的优势在于它是Windows的“本机”,这有助于您使用Windows调用。缺点是存储空间,它们(如UTF-8)可能需要多个WideChars来编码完整的Unicode空间。
.=‘8’>一般更可取。与WideStrings一样,这是一种多字节编码,因此一个特定的unicode‘代码点’可能需要字符串中的几个字节来对其进行编码。这只是一个问题,如果您正在对您的字符串进行大量的逐字符处理。
@DavidHeffernan评论(正确无误)指出,在某些情况下,WideStrings可能更紧凑。然而,我只推荐UTF-16,只有当您绝对确信您的编码文本真的会更加紧凑(不要忘记标记!),而且这种紧凑性对您非常重要。
发布于 2013-12-04 02:23:22
在HTML 4中,数字字符引用相对于HTML使用的字符集。不管该字符集是通过<meta>标记在HTML本身中指定的,还是通过HTTP/MIME Content-Type头或其他方式指定的,这都无关紧要。因此,只有当"ABCģķī"使用UTF-16时,"ABCģķī"才能准确地表示"ABCģķī"。如果HTML使用的是UTF-8,则正确的表示形式应该是"ABCģķī"或"ABCģķī"。大多数其他字符集不支持这些特定的Unicode字符。
在HTML 5中,数字字符引用包含原始Unicode代码点值,而不考虑HTML使用的字符集。因此,"ABCģķī"将表示为"ABC#291;ķī"或"ABCģķī"。
因此,要回答您的问题,您必须做的第一件事是决定是否需要对数字字符引用使用HTML 4或HTML 5语义。然后,需要将Unicode数据分配给WideString (Delphi7本机支持的惟一Unicode字符串类型),它使用UTF-16,然后:
WideCharToMultiByte() (或等效的)将WideString转换为该字符集,然后循环遍历结果值,输出保留值的非保留字符和字符引用,使用IntToStr()作为十进制表示法或IntToHex()作为十六进制表示法。
如果HTML是UTF-16,那么只需循环遍历WideString中的每个WideString,输出保留值的非保留字符和字符引用,使用IntToStr()作为十进制表示法或IntToHex()作为十六进制表示法。WideString不包含任何代理项对,那么只需循环遍历WideString中的每个WideChar,输出保留值的非保留字符形式和字符引用,使用IntToStr()作为十进制表示法,使用IntToHex()表示十六进制表示法。
否则,使用WideString将WideStringToUCS4String()转换为UTF-32,然后循环遍历结果值,输出保留代码点的非保留代码点和字符引用,十进制表示法使用IntToStr()或十六进制表示法使用IntToHex()。发布于 2013-12-03 12:46:06
如果我正确理解了操作,我就把这个留在这里。
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;https://stackoverflow.com/questions/20347587
复制相似问题