【问题标题】:Why am I able to use a character that's not part of a charset (windows-1252)?为什么我可以使用不属于字符集 (windows-1252) 的字符?
【发布时间】:2014-02-01 17:37:41
【问题描述】:

我正在寻求一些帮助以了解字符集的工作原理。这个问题是Anything wrong with using windows-1252 instead of UTF-8的继续@

我有一个测试 ColdFusion 站点,使用...

<CFHEADER NAME="Content-Type" value="text/html; charset=windows-1252">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />

以及使用...的测试 Oracle 数据库

NLS_CHARACTERSET: WE8MSWIN1252
NLS_NCHAR_CHARACTERSET: AL16UTF16

根据 windows-1252 字符集,没有平方根符号 (alt+251): √ 但我可以将其键入网页表单的字段中,将其保存到数据库,查询并显示在屏幕上再次就好了。当它在数据库中时,它存储为:&amp;#8730;。如果它甚至不是字符集的一部分,我该如何输入、存储、查询和显示它?根据字符集,十进制 251 是这样的:Hex:FB | û | 00FB | LATIN SMALL LETTER U WITH CIRCUMFLEX

【问题讨论】:

  • 你是说在数据库中,字符被存储为一个 7 字节的转义码?
  • 是的。当我在 TOAD 中选择该列时,这就是它显示的内容。我还没有从命令行尝试过。您是否认为这可能就是 TOAD 向我展示的方式?

标签: oracle encoding coldfusion character-encoding windows-1252


【解决方案1】:

您并没有真正使用页面和数据库字符集之外的字符。

因为页面是 windows-1252 编码的,如果你在表单域中输入 Alt+251 然后发布数据,浏览器会说:

"Hey this char is not apart of windows-1252 and I need to only send back data
 which is in windows-1252, so I will do the best I can and send back the 
 html character code of char &#8730;  -- oh well, I wish I could send back
 1 character, since I cannot I will send back 7."

如果您注意到,这是 windows-1252 字符集中的 7 个不同字符。

如果页面是用多字节字符集编码的,浏览器会发回一些被认为是 1 个字符的东西。

那么怎么查询呢?

 select * from tab where field like '%&#8730;%'

你所拥有的是平方根符号的html字符:https://www.google.com/#q=html+character+codes

更新:

这是一篇很好的文章,解释了正在发生的事情:http://htmlpurifier.org/docs/enduser-utf8.html

 "...once you start adding characters outside of your encoding... 
 [the browser might] replace the character with a character entity reference...."

此外,当您在 Windows 机器上输入 Alt+251 时,它会插入平方根符号,在 Unicode 中为 U-221A。

按 Alt+251 就像键盘宏插入 Unicode 它是 U-221A。

【讨论】:

  • 嗯,好的,但是为什么Alt+251 不插入Hex:FB | û | 00FB | LATIN SMALL LETTER U WITH CIRCUMFLEX,因为那是字符集中那个位置的字符?
  • 根据我的经验,浏览器会自动跳到发送 utf-8 值。 HTML 规范说他们应该发送一个内容类型的标题'text/plain;字符集:utf-8 但他们没有。在您上面的测试站点中,如果您在以 HTML 或表单字段的值显示内容时将内容从数据库中转出,则它会中断,因为转义将转义编码值中的 & 符号。跨度>
  • 好的,你们是说不管我的字符集如何,我仍然可以发送、保存和重新查询任何可能的字符?如果是这样,那么如果它们都可以正常工作,那么定义一个字符集又有什么意义呢? (我不在我的电脑上尝试其他 unicode 字符,但明天会进行更多测试)。在离开数据库的路上,它显示在文本区域中,并正确显示平方根符号。我没有尝试将其显示为来自数据库的文本。为了防止 XSS,当显示为文本时,我调用 ColdFusion esapi encodeforhtml。我明天也会测试一下。谢谢大家。
  • @gfrobenius,不一定...它正在使用平方根符号,因为平方根有一个 html 字符实体。我不知道在所有情况下会发生什么。希望有人可以提供更多见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2013-02-10
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
相关资源
最近更新 更多