Как поменять кодировку из ACII в UTF-8?
<?php $db = new yiidbConnection([ 'dsn' => 'dblib:host=192.111.11.114;dbname=name', 'username' => 'us', 'password' => 'pas', 'charset' => 'utf8', ]); $result = $db->createCommand("EXECUTE get :prod") ->bindValue(':prod_sn',$SN) ->queryAll(); ?> |
<?php $db = new yiidbConnection([ 'dsn' => 'dblib:host=192.111.11.114;dbname=name', 'username' => 'us', 'password' => 'pas', 'charset' => 'utf8', ]); $result = $db->createCommand("EXECUTE get :prod") ->bindValue(':prod_sn',$SN) ->queryAll(); ?>
/
echo mb_detect_encoding($result[$i]);
здесь говорит что кодировка ASCII
mb_convert_encoding($result[$i], "ASCII", "UTF-8"); |
mb_convert_encoding($result[$i], "ASCII", "UTF-8");
Кодировку после этого не меняет
Подскажите где туплю?
Все русские символы из бд приходят знаками вопроса
Дополнительно:
Ответы:
В кодировке ASCII (American standard code for information interchange) нет и никогда не было кириллицы. У вас, скорее всего, cp1251.
- Данные приходят вперемешку русские и английские слова.
но почему тогда echo mb_detect_encoding($res[$i]); показывает ASCII?
Перекодировка из cp1251 в UTF8 не помогла - petr_reznikov, если БД таки на виндовской кодировке cp1251, а вы тянете из нее информацию, указав в соединении utf-8 - в этой информации вся кириллица могла превратиться в знаки вопроса. mb_detect_encoding видит, что в тексте только символы в кодировке ASCII, и честно об этом рассказывает.
- Adamos, Понял, тогда какую кодировку стоит указать при подключении к бд?
- petr_reznikov, вы запутались сами и запутали отвечающих.
Ваша проблема - в строчке mb_detect_encoding($result[$i]);
Выведите print_r($result[$i]) и посмотрите, что вы передаете в функцию вместо строки. - Adamos, 0_о передаётся строка
- petr_reznikov, queryAll возвращает массив записей, каждая из которых - массив полей. $result[$i] должно быть массивом, если вы не выкинули из вопроса переопределение переменной.
- Adamos, так и есть, в переменной обычная строка, которую вытащил из массива. Просто чтобы не захламлять не стал всё прописывать. к вопросу это значения не имеет
- petr_reznikov, браво, вы, ловко сократив вопрос, обманули следователя, детектор лжи и идущих по следу адских гончих. Теперь можно разбираться, что у вас все-таки с базой.
Все русские символы из бд приходят знаками вопроса
Внезапно, mb_detect_encoding('????') таки выдаст ASCII, и это будет правдой. Но никакого отношения к базе это не имеет. Определяйте настоящую кодировку базы и указывайте ее в настройках подключения. Без этого никакие манипуляции в дальнейшем РНР вам ничего не дадут.
- Adamos, ок, спасибо
- Adamos, В базе кодировка ANSI
Но прописывая
'charset' => 'windows-1251',
не помогает - petr_reznikov, ANSI / ASCII - это древняя американская кодировка на 128 символов, с которых сейчас начинаются все остальные. Кириллицы в ней НЕТ.
Поэтому у вашей базы НИКАК не может быть такой кодировки. - Adamos, ANSI это не то же что ASCII, в Windows так принято называть 8-битные Windows-кодировки, т.е. если кириллица выбрана как язык, то ANSI-кодировкой будет Windows-1251, OEM-кодировкой cp866. Можно попробовать системный язык установить в кириллицу.
- Владимир Дубровин, M$ славится своей собственной терминологией.
Но собственно аббревиатура ANSI кодировкой быть никак не может. - Adamos, 8 битные кодировки и их стандартизация это вообще страдание, к счастью почти вымершее. Это старая история https://en.wikipedia.org/wiki/Windows_code_page#AN... - на тот момент стандартов на 8-битные кодировки просто не существовало. Сначала планировалась совместимость с разрабатываемым стандартом ANSI и API декодирования (например) назвали типа OemToAnsi. Потом ANSI отказалась от стандартизации 8-битных кодировок и методы переименовали (в OemToChar например), но старое название прижилось, потому что ISO в итоге стандартизировало другие кодировки и в итоге оказалось на N пропиетарных стандартов больше
- Владимир Дубровин, а теперь винды бережно хранят весь этот мусор ради совместимости. Да, старая история.
Но, возвращаясь к вопросу ТС - у него все-таки, скорее всего, либо UTF-8, либо CP1251. Просто потому, что в вебе крайне редко используется что-то другое.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для изменения кодировки из ASCII в UTF-8 в PHP можно воспользоваться функцией iconv. Эта функция позволяет конвертировать строку из одной кодировки в другую. Для выполнения данной операции необходимо указать исходную кодировку (ASCII) и целевую кодировку (UTF-8).
Пример кода:
$asciiString = "Пример текста в ASCII"; $utf8String = iconv('ASCII', 'UTF-8', $asciiString); echo $utf8String;
В данном примере мы задаем исходную кодировку 'ASCII', целевую кодировку 'UTF-8' и преобразуем строку $asciiString в UTF-8. После этого выводим полученную строку $utf8String.
Если требуется изменить кодировку не только для строки, но и для всего файла, можно воспользоваться функцией mb_convert_encoding. Эта функция выполняет преобразование кодировки для всего текстового файла.
Пример использования mb_convert_encoding:
$fileContent = file_get_contents('example.txt'); $utf8Content = mb_convert_encoding($fileContent, 'UTF-8', 'ASCII'); file_put_contents('example_utf8.txt', $utf8Content);
В этом примере мы считываем содержимое файла 'example.txt', преобразуем его кодировку из ASCII в UTF-8 с помощью функции mb_convert_encoding, и записываем результат обратно в файл 'example_utf8.txt'.
Таким образом, используя функции iconv и mb_convert_encoding, можно легко изменить кодировку из ASCII в UTF-8 как для строк, так и для текстовых файлов в PHP.