|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Apr 2007
Сообщений: 45
|
Конвертирование win1251 <-> utf8 в PHP и Flex
Использую следующие функции для конвертирования на стороне flex-приложения:
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"); } private function utf2win(data:String):String { var b:ByteArray = new ByteArray(); b.writeMultiByte(data,"windows-1251"); return b.toString(); } Но если попытаться вывести записанные данные в базу средствами php-скрипта, то вместо Смирнов Константин Геннадиевич выводится ÑìèðГ*îâ ГЉГ®Г*Г±ГІГ Г*ГІГЁГ* ГѓГҐГ*Г*à äèåâè÷ Не помогает Странно, ведь через Flex все выводится! Как мне правильно раскодировать строку? |
|
|||||
Регистрация: Apr 2007
Сообщений: 45
|
Ребята, вот что я имею:
Перевел строку в последовательность байт, имею вместо: Строку в 2 раза длиннее: c392c3a5c3b0c3b1c3aac3aec3a2c3a020c38dc3a0c3b2c3a0c3abc3a8c3bf20c382c3abc3a0c3a4c3a8c3acc3a8c3b0c3aec3a2c3adc3a0 Как бы перевести из C3 92 в D2 ? |
|
|||||
Регистрация: Apr 2007
Сообщений: 45
|
Проект уже работает. В базе уже есть данные. Нужно их использовать.
Сам файл php, видимо, также в window-1251 кодировке. Если в нем написать echo "Это текст на русском", то он выведется правильно и в браузере будет установлена кодировка win-1251. Теперь данные из базы в виде c392 c3a5 ... нужно преобразовать к нормальному выводу в данной кодировке (т.е. d2 e5 ... в шестнадцатеричном представлении) |
|
|||||
Регистрация: Jun 2011
Сообщений: 212
|
Для внутреннего хранения значений с типом String в actionscript используются символы Unicode и формат UTF-16.
То есть b.toString() возвращает вам строку UTF-16. Дальше разберетесь? |
|
|||||
Регистрация: Apr 2007
Сообщений: 45
|
Не совсем понятно...
Мне нужно уже в php работать со строкой, которая получена из базы MySQL и, видимо, представляет собой строку в utf-16 (2 байта на символ) преобразованную функцией utf2win в двухбайтовый псевдо win-1251. Как мне сделать обратную операцию на php? Последний раз редактировалось kostasoft; 26.10.2011 в 20:37. |
|
|||||
Регистрация: Jun 2011
Сообщений: 212
|
Вам не нужно делать обратную операцию на php. Вам нужно бороться с проблемой, которую вы себе создаете сами в функции utf2win. Перепишите функцию так:
private function utf2win(data:String):ByteArray { var b:ByteArray = new ByteArray(); b.writeMultiByte(data,"windows-1251"); return b; } Повторюсь: b.toString() возвращает вам строку UTF-16 (потому что это тип String, который в AS3 всегда в виде UTF16). \ А ByteArray, возвращаемый измененной utf2win, это как раз то что вам нужно (win1251). Вот это и передавайте в php. Таким образом в базу у вас будут попадать правильные данные и не нужна будет никакая "обратную операция". Добавлено через 13 минут Что касается данных, которые уже попали в базу в неправильном виде, то их нужно либо удалить, либо (если их много и они нужны) - "вылечить": 1. Делаете дамп в файл, состоящий только (!) из "неправильных" записей. Чтобы кодировка в дампе была нормальной, подключаетесь к базе с charset = utf16. 2. Дамп естественно будет в utf16. Конвертируете его в win1251 как обычный текстовый файл любым удобным способом (notepad, скрипт на php и т.п.). 3. Удаляете из базы "неправильные" записи. 4. Импортируете исправленный дамп обратно в базу. |
|
|||||
Регистрация: Apr 2007
Сообщений: 45
|
Понятно.
Последний вопрос, как без изменений представить ByteArray, содержащий коды символов в win1251-кодировке в виде строки. У меня данные передаются в php-скрипт именно как строка. |
|
|||||
Регистрация: Jun 2011
Сообщений: 212
|
покажите код который передает данные
|
|
|||||
Регистрация: Apr 2007
Сообщений: 45
|
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",""); 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, время: 20:33. |
|
« Предыдущая тема | Следующая тема » |
|
|