2009-10-07 1 views
2

У меня есть классическая страница ASP, которая получает POSTed. Данные получают POSTED как UTF-8 (я вижу это в Fiddler). Затем я открываю соединение ADODB с базой данных и сохраняю данные в поле VARCHAR. Если данные могут быть представлены 8859-1 (например, iñtërnâtiônàlizætiøn), они сохраняются правильно в поле varchar. Если я попробую строки, которые не могут быть сопоставлены с 8859 (например, Здравствуйте!), Я получаю ????????????!. Все это имеет смысл, поскольку поле varchar не может содержать юникод. Я также понимаю, что использование поля nvarchar должно позволить мне хранить строки utf-8.Классический ASP, SQL Server и кодировки символов

Мой вопрос в том, что. Какие параметры в SQL Server или в объекте ADODB управляют тем, как строки преобразуются из UTF-8 в 8859-1? VBScript (ASP) отправляет строки в ADODB.Connection.Execute как UTF-8 (или, как я думаю, это действительно делает - UTF-16), и сама база данных обрабатывает преобразование? Это контролируется путем сопоставления базы данных (SQL_Latin1_General_CP1_CI_AS в этом случае)?

+0

FWIW, IIRC, ASP использует UTF-16 внутренне для всего. – EricLaw

ответ

2

Вы верны.

VBScript и ADODB знают только строки как Unicode (или UTF-16, как его иногда называют).

Его часть настроек сопоставления БД, определяющая порядок кодирования полей VARCHAR.

В SQL_Latin1_General_CP1_CI_AS его действительно бит CP1, который определяет CodePage для использования. В этом случае 1 является устаревшей ссылкой на Windows-1252, которая является надмножеством ISO-8859-1.

+0

Юникод - это больше, чем просто UTF-16; UTF-16 является одним из многих кодировок Unicode. –

+0

@Dave, ADODB, VBScript, VB6, .NET, Windows API, который вы называете, все используют 2-байтовую кодировку Unicode. Следовательно, термин «Юникод» стал синонимом кодировки UTF-16 (например, взгляните на документацию API Scripting.FileSystemObject.OpenTextStream без упоминания UTF-16 только в формате unicode). Хотя это технически неточно для всех практических целей, оно нам хорошо помогает. Я не знаю никакой системы, которая фактически хранит символы Unicode как 32-битные слова. Кроме того, UTF-8 используется последовательно для обозначения 8-битного кодирования. Следовательно, большинство людей понимают «Юникод», что означает 16-битную кодировку. – AnthonyWJones

3

Если переключиться на использование NVARCHAR вместо, то вам нужно помнить, чтобы использовать N спецификатор в ваших команд SQL, как так всякий раз, когда вы используете строку, которая является Unicode

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

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

Если вы не делаете это приведет к тому, что строки не будут обрабатываться как Unicode, и ваши данные будут беззвучно преобразованы в Latin1 или что-то другое, установленное по умолчанию для соответствующей базы данных/таблицы/поля , даже если это поле является NVARCHAR

+0

Спасибо за этот намек. Наверное, спас мне серьезную головную боль! – BlaM