【问题标题】:Classic ASP, SQL Server and character encodings经典 ASP、SQL Server 和字符编码
【发布时间】:2009-10-07 15:37:04
【问题描述】:

我有一个经典的 ASP 页面被发布到。数据以 UTF-8 形式发布(我可以在 Fiddler 中看到)。然后我打开一个到数据库的 ADODB 连接并将数据存储在 VARCHAR 字段中。如果数据可以用 8859-1 表示(例如 iñtërnâtiônàlizætiøn),它会正确存储在 varchar 字段中。如果我尝试无法映射到 8859 的字符串(例如 Здравствуйте!),我会得到 ????????????!。这一切都是有道理的,因为 varchar 字段不能保存 unicode。我也明白使用 nvarchar 字段应该使我能够存储 utf-8 字符串。

我的问题是这样的。 SQL Server 或 ADODB 对象中的哪些设置控制如何将字符串从 UTF-8 转换为 8859-1? VBScript (ASP) 是否将字符串作为 UTF-8 发送到 ADODB.Connection.Execute(或者我认为它实际上在做什么 - UTF-16)并且数据库本身会处理转换?这是否由数据库的排序规则控制(本例中为 SQL_Latin1_General_CP1_CI_AS)?

【问题讨论】:

  • FWIW、IIRC、ASP 在内部都使用 UTF-16。

标签: asp-classic character-encoding ado


【解决方案1】:

如果您改用 NVARCHAR,那么您需要记住在 SQL 命令中使用 N 说明符,就像每当您使用 Unicode 字符串时一样

INSERT INTO SOME_TABLE (someField) VALUES (N'Some Unicode Text')

SELECT * FROM SOME_TABLE WHERE someField=N'Some Unicode Text'

如果您不这样做,则字符串不会被视为 Unicode,并且您的数据将被静默转换为 Latin1 或相关数据库/表/字段的默认字符集 即使 em> 该字段是 NVARCHAR

【讨论】:

  • 感谢您的提示。可能让我头疼不已!
【解决方案2】:

你是对的。

VBScript 和 ADODB 仅将字符串视为 Unicode(或有时称为 UTF-16)。

它是决定 VARCHAR 字段如何编码的 DB 排序规则设置的一部分。

SQL_Latin1_General_CP1_CI_AS 中,它实际上是CP1 位,它决定了要使用的CodePage。在这种情况下,1 是对 Windows-1252 的旧版引用,它是 ISO-8859-1 的超集。

【讨论】:

  • Unicode 不仅仅是 UTF-16; UTF-16 是众多 Unicode 编码之一。
  • @Dave, ADODB, VBScript, VB6, .NET, Windows API 都使用 Unicode 的 2 字节编码。因此,“Unicode”一词已成为 UTF-16 编码的同义词(例如,查看 Scripting.FileSystemObject.OpenTextStream 的 API 文档,没有提到 UTF-16 只是 unicode)。虽然这在技术上对于所有实际目的都是不准确的,但它很好地为我们服务。我知道没有系统将 Unicode 字符实际存储为 32 位字。此外,UTF-8 始终用于指代 8 位编码。因此,大多数人将“Unicode”理解为 16 位编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多