|
|
|
| Ситуация такая что с удаленного сайта скрипт получает строку.
Сайт может быть в любой кодировке и через заголовки ее не отследить.
Когда строка получена нужно определить ее кодирокву, сменить на UTF-8 если нужно и сделать запись в БД
Подскажите пожалуйста как определить кодировку и сделать нормальную запись в БД с нею
PS. всего 3 вида кодировок приходит cp1251, utf-8, utf-8 без BOM | |
|
|
|
|
|
|
|
для: Byrger
(26.10.2011 в 00:26)
| | Русский текст присутствует в сообщении всегда? Нельзя ли поискать русские буквы в кодировке UTF-8, если они есть, значит это UTF-8, если нет - cp1251.
PS Собственно, если русских букв нет - проблема сама собой решается, английский текст во всех кодировках выглядит одинаково. | |
|
|
|
|
|
|
|
для: cheops
(26.10.2011 в 11:45)
| | Спасибо за ответ.
Не могли бы подсказать как искать русские буквы?
Разве в utf-8 их не может быть? | |
|
|
|
|
|
|
|
для: Byrger
(26.10.2011 в 17:10)
| | Для этого хорошо бы иметь скрипт в кодировке cp1251, который использует для поиска строковые функции вроде strpos() - они не поддерживают многобайтовые кодировки и ищут только по одному байту. Русские UTF-8 символов в файле с кодировкой cp1251 можно представить следующим образом.
<?php
$utf8 = array("%D0%B0","%D0%B1","%D0%B2","%D0%B3","%D0%B4",
"%D0%B5","%D1%91","%D0%B6","%D0%B7","%D0%B8",
"%D0%B9","%D0%BA","%D0%BB","%D0%BC","%D0%BD",
"%D0%BE","%D0%BF","%D1%80","%D1%81","%D1%82",
"%D1%83","%D1%84","%D1%85","%D1%86","%D1%87",
"%D1%88","%D1%89","%D1%8A","%D1%8B","%D1%8C",
"%D1%8D","%D1%8E","%D1%8F","%D0%90","%D0%91",
"%D0%92","%D0%93","%D0%94","%D0%95","%D0%81",
"%D0%96","%D0%97","%D0%98","%D0%99","%D0%9A",
"%D0%9B","%D0%9C","%D0%9D","%D0%9E","%D0%9F",
"%D0%A0","%D0%A1","%D0%A2","%D0%A3","%D0%A4",
"%D0%A5","%D0%A6","%D0%A7","%D0%A8","%D0%A9",
"%D0%AA","%D0%AB","%D0%AC","%D0%AD","%D0%AE",
"%D0%AF");
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(27.10.2011 в 17:32)
| |
class cp1251
{
public $utf8 = array("%D0%B0","%D0%B1","%D0%B2","%D0%B3","%D0%B4",
"%D0%B5","%D1%91","%D0%B6","%D0%B7","%D0%B8",
"%D0%B9","%D0%BA","%D0%BB","%D0%BC","%D0%BD",
"%D0%BE","%D0%BF","%D1%80","%D1%81","%D1%82",
"%D1%83","%D1%84","%D1%85","%D1%86","%D1%87",
"%D1%88","%D1%89","%D1%8A","%D1%8B","%D1%8C",
"%D1%8D","%D1%8E","%D1%8F","%D0%90","%D0%91",
"%D0%92","%D0%93","%D0%94","%D0%95","%D0%81",
"%D0%96","%D0%97","%D0%98","%D0%99","%D0%9A",
"%D0%9B","%D0%9C","%D0%9D","%D0%9E","%D0%9F",
"%D0%A0","%D0%A1","%D0%A2","%D0%A3","%D0%A4",
"%D0%A5","%D0%A6","%D0%A7","%D0%A8","%D0%A9",
"%D0%AA","%D0%AB","%D0%AC","%D0%AD","%D0%AE",
"%D0%AF");
public function isUTF8($str){
foreach($this->utf8 as $uv){
if(strpos($str, $uv) === true)
return true;
}
return false;
}
}
|
Всегда выдет false
Скрипт в ANSI | |
|
|
|
|
|
|
|
для: Byrger
(29.10.2011 в 10:27)
| | А как текст поступает скрипту (из какого источника)? | |
|
|
|
|
|
|
|
для: Byrger
(29.10.2011 в 10:27)
| |
if(strpos($str, $uv) === true)
|
результат не может быть true, поэтому:
if(strpos($str, $uv) !== false)
|
| |
|
|
|
|
|
|
|
для: sl1p
(29.10.2011 в 14:15)
| | Не получается.
Всегда false возвращает | |
|
|
|
|
|
|
|
для: Byrger
(26.10.2011 в 00:26)
| | На просторах интернета видел такое решение определения utf-8
if (preg_match('//u', $string)) { /* у вас UTF-8 */ }
|
попробуйте может вам подойдет | |
|
|
|
|