powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Проблема с UCS-2
4 сообщений из 4, страница 1 из 1
Проблема с UCS-2
    #37521175
Assador
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Заранее извиняюсь, что вопрос связан с ASP, а не ASP.NET. Но здесь соответствующей ветки не нашёл... Есть проблема c кодировкой. Windows Server 2003, MS SQL Server 2000. Пытаюсь на ASP в PerlScript средствами ADO вытащить строку из базы. Строка в базе лежит в UCS-2. Как ни бился — кракозябры. Пробовал и codepage=65001 ставить, и использовать DBI вместо ADO, и пытаться конвертировать по-разному. Двухдневное гугление ничего не прояснило. Что характерно, на JavaScript вместо PerlScript таких проблем не возникает. Но необходимо прикрутить к CMS довольно объёмный перловый скрипт для обработки текста. Ниже простейший пример: попытка получить строку и записать её в utf8-файл. Кракозябры...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
<%@ LANGUAGE="PerlScript" %>
<%
use encoding "utf8";
use Encode;

my ($dbParams, $oConn, $oRs, $sql);
$oConn = $Server->CreateObject("ADODB.Connection");
$oConn->Open('Provider=SQLOLEDB;Initial Catalog=template;Data Source=(local);User ID=user;Password=password');
$oRs = $Server->CreateObject("ADODB.Recordset");
$oRs->{ActiveConnection} = $oConn;
$sql = "SELECT [title] FROM [obj] WHERE n=1511";
$oRs->{Source} = $sql;
$oRs->Open();
while(!$oRs->{eof}) {
# Ниже просто проверка путём конвертации и записи в файл.
# Получаются кракозябры и при UCS-2BE, и при любых других юникодных представлениях.
# Такое ощущение, что из базы передаётся просто не юникод.
# Если в decode() указать cp1251, то кириллица показывается нормально.
	open(TEMP, ">:encoding(utf8)", 'E:\temp.txt');
	print TEMP decode("UCS-2BE", $oRs->{title}->{Value});
	close TEMP;
	$oRs->MoveNext();
}
$oRs->Close();
$oConn->Close();
%>
...
Рейтинг: 0 / 0
Проблема с UCS-2
    #37521271
Assador
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё, решил сам, хотя и пришлось через известное место. Приведённый выше, но рабочий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<%@ LANGUAGE="PerlScript" %>
<%
use encoding "utf8";
use Encode;
my ($dbParams, $oConn, $oRs, $sql);
$oConn = $Server->CreateObject("ADODB.Connection");
$oConn->Open('Provider=SQLOLEDB;Initial Catalog=template;Data Source=(local);User ID=user;Password=password');
$oRs = $Server->CreateObject("ADODB.Recordset");
$oRs->{ActiveConnection} = $oConn;
$sql = "select cast(cast([title] as nvarchar(4000)) as varbinary(8000)) as [title] from [obj] where n=1511";
$oRs->{Source} = $sql;
$oRs->Open();
while(!$oRs->{eof}) {
	open(TEMP, ">:encoding(utf8)", 'E:\sites\temp.txt');
	print TEMP decode("UCS-2LE", pack("H*", unpack("H*", $oRs->{title}->{Value})));
	close TEMP;
	$oRs->MoveNext();
}
$oRs->Close();
$oConn->Close();
%>

То есть, получаем из БД hex юникодной строки (она изначально была типа ntext, так что пришлось промежуточно перевести в nvarchar), распаковываем в символьную строку hex, запаковываем обратно и уже потом нормально декодируем. Знаю, что извращение, но по крайней мере работает :) Позже попробую решить проблему более адекватно. А, ну и в первом примере ошибся. Кодировка UCS-2LE была, а не UCS-2BE.
...
Рейтинг: 0 / 0
Проблема с UCS-2
    #37521380
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Assador,

Модератор: Могу в перловый форум перенести, если хотите.
...
Рейтинг: 0 / 0
Проблема с UCS-2
    #37521521
Assador
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShSerge, может, и стоит. Не один я с такой штукой сталкивался. Подобных вопросов нагуглил много, а вот ответов не нашёл. А с другой стороны, это к перлу отношения имеет мало. Скорее к PerlScript. Но как вам кажется логичнее, так и поступайте.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Проблема с UCS-2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]