Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.10.2011, 17:42
kostasoft вне форума Посмотреть профиль Отправить личное сообщение для kostasoft Найти все сообщения от kostasoft
  № 1  
Ответить с цитированием
kostasoft

Регистрация: Apr 2007
Сообщений: 45
По умолчанию Конвертирование win1251 <-> utf8 в PHP и Flex

Использую следующие функции для конвертирования на стороне flex-приложения:
Код AS3:
private function win2utf8(data:String):String
{
	var b:ByteArray = new ByteArray();	
	for (var i:uint = 0; i < data.length; i++)
		b[i] = data.charCodeAt(i);
	return b.readMultiByte(b.bytesAvailable, "windows-1251");
}
Код AS3:
private function utf2win(data:String):String 
{
	var b:ByteArray = new ByteArray();
	b.writeMultiByte(data,"windows-1251");
	return b.toString();
}
Данные, переконвертированные данными функциями заносятся php-скриптом в mysql базу (и выводятся) (в базе используется кодировка cp1251). Все ОК.
Но если попытаться вывести записанные данные в базу средствами php-скрипта, то вместо
Смирнов Константин Геннадиевич выводится ÑìèðГ*îâ ГЉГ®Г*Г±ГІГ Г*ГІГЁГ* ГѓГҐГ*Г*à äèåâè÷
Не помогает
PHP код:
iconv('utf-8''windows-1251'$row[3]); 
Странно, ведь через Flex все выводится!
Как мне правильно раскодировать строку?

Старый 26.10.2011, 19:42
kostasoft вне форума Посмотреть профиль Отправить личное сообщение для kostasoft Найти все сообщения от kostasoft
  № 2  
Ответить с цитированием
kostasoft

Регистрация: Apr 2007
Сообщений: 45
Ребята, вот что я имею:
Перевел строку в последовательность байт, имею вместо:
Код:
d2e5f0f1eaeee2e020cde0f2e0ebe8ff20c2ebe0e4e8ece8f0eee2ede0
Строку в 2 раза длиннее:
Код:
c392c3a5c3b0c3b1c3aac3aec3a2c3a020c38dc3a0c3b2c3a0c3abc3a8c3bf20c382c3abc3a0c3a4c3a8c3acc3a8c3b0c3aec3a2c3adc3a0
Все в кодировке Windows-1251.
Как бы перевести из C3 92 в D2 ?

Старый 26.10.2011, 19:53
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 3  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Зачем вам Windows-1251, пишите все в UTF-8. Ничего перекодировать не нужно даже если у вас БД на win-1251

Старый 26.10.2011, 20:09
kostasoft вне форума Посмотреть профиль Отправить личное сообщение для kostasoft Найти все сообщения от kostasoft
  № 4  
Ответить с цитированием
kostasoft

Регистрация: Apr 2007
Сообщений: 45
Проект уже работает. В базе уже есть данные. Нужно их использовать.
Сам файл php, видимо, также в window-1251 кодировке.
Если в нем написать echo "Это текст на русском", то он выведется правильно и в браузере будет установлена кодировка win-1251.
Теперь данные из базы в виде c392 c3a5 ... нужно преобразовать к нормальному выводу в данной кодировке (т.е. d2 e5 ... в шестнадцатеричном представлении)

Старый 26.10.2011, 20:20
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 5  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
Для внутреннего хранения значений с типом String в actionscript используются символы Unicode и формат UTF-16.
То есть b.toString() возвращает вам строку UTF-16.
Дальше разберетесь?

Старый 26.10.2011, 20:31
kostasoft вне форума Посмотреть профиль Отправить личное сообщение для kostasoft Найти все сообщения от kostasoft
  № 6  
Ответить с цитированием
kostasoft

Регистрация: Apr 2007
Сообщений: 45
Не совсем понятно...
Мне нужно уже в php работать со строкой, которая получена из базы MySQL и, видимо, представляет собой строку в utf-16 (2 байта на символ) преобразованную функцией utf2win в двухбайтовый псевдо win-1251.
Как мне сделать обратную операцию на php?


Последний раз редактировалось kostasoft; 26.10.2011 в 20:37.
Старый 26.10.2011, 20:57
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 7  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
Вам не нужно делать обратную операцию на php. Вам нужно бороться с проблемой, которую вы себе создаете сами в функции utf2win. Перепишите функцию так:

Код AS3:
private function utf2win(data:String):ByteArray 
{
	var b:ByteArray = new ByteArray();
	b.writeMultiByte(data,"windows-1251");
	return b;
}
В таком варианте utf2win действительно возвращает win1251.

Повторюсь:
b.toString() возвращает вам строку UTF-16 (потому что это тип String, который в AS3 всегда в виде UTF16). \

А ByteArray, возвращаемый измененной utf2win, это как раз то что вам нужно (win1251).

Вот это и передавайте в php. Таким образом в базу у вас будут попадать правильные данные и не нужна будет никакая "обратную операция".

Добавлено через 13 минут
Что касается данных, которые уже попали в базу в неправильном виде, то их нужно либо удалить, либо (если их много и они нужны) - "вылечить":

1. Делаете дамп в файл, состоящий только (!) из "неправильных" записей.
Чтобы кодировка в дампе была нормальной, подключаетесь к базе с charset = utf16.

2. Дамп естественно будет в utf16. Конвертируете его в win1251 как обычный текстовый файл любым удобным способом (notepad, скрипт на php и т.п.).

3. Удаляете из базы "неправильные" записи.

4. Импортируете исправленный дамп обратно в базу.

Старый 27.10.2011, 00:52
kostasoft вне форума Посмотреть профиль Отправить личное сообщение для kostasoft Найти все сообщения от kostasoft
  № 8  
Ответить с цитированием
kostasoft

Регистрация: Apr 2007
Сообщений: 45
Понятно.
Последний вопрос, как без изменений представить ByteArray, содержащий коды символов в win1251-кодировке в виде строки. У меня данные передаются в php-скрипт именно как строка.

Старый 27.10.2011, 00:53
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 9  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
покажите код который передает данные

Старый 27.10.2011, 01:49
kostasoft вне форума Посмотреть профиль Отправить личное сообщение для kostasoft Найти все сообщения от kostasoft
  № 10  
Ответить с цитированием
kostasoft

Регистрация: Apr 2007
Сообщений: 45
Код AS3:
var querystr:String ="INSERT INTO `inst_table` (`login`, `pass`, `email`, `fullname`) VALUES ("
			+"'"+iWindow.e1.text+"', "
			+" '"+iWindow.e2.text+"', "
			+" '"+iWindow.e3.text+"', "
			+" '"+iWindow.e4.text+"'"
			+")";
	mysqlQuery(querystr,"INSERTI","");
где
Код AS3:
public function mysqlQuery(sql:String,fid:String,lim:String):void {
	var http:HTTPService = new HTTPService();
	var parm:Object = new Object;
	parm.sql = utf2win(sql);
	parm.lim = utf2win(lim);
 
	parm.fas_type = fid;
 
	parm.name = utf2win(eName.text);
	parm.pass = utf2win(ePass.text);
 
	http.url = mysql_url+"?irand="+Math.random();
	http.method = "POST";
	http.showBusyCursor = true;
	http.addEventListener(ResultEvent.RESULT, mysqlResult);
	http.addEventListener(FaultEvent.FAULT, mysqlFault);
 
	sqlToken = http.send(parm);
	sqlToken.param = fid;
}

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:14.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:14.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.