Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521

Неправильная кодировка fgetcsv

31.10.2019, 15:10. Показов 4588. Ответов 17

Студворк — интернет-сервис помощи студентам
Добрый день. Получаю данные из csv файла, выводятся как знаки вопроса. В чем проблема не могу понять. Перерыл весь инет уже, не могу решить проблему, вернее решил, но появилась другая.
Поставил
PHP
1
header('Content-Type: text/html; charset=cp1251');
Символы стали нормально отображаться, дальше функция транслита, которая должна корректна отрабатывать возвращает первоначальную переданную строку, ничего не поменяв
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function transliterate($st) {
    $st = strip_tags($st); 
  $st = str_replace(array("\n", "\r"), " ", $st);
  $st = preg_replace("/\s+/", ' ', $st);
  $st = trim($st);
  $st = mb_strtolower($st, 'CP1251');
  $st = strtr($st, 
    "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
    "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
  );
  $st = strtr($st, array(
    'ё'=>"yo",    'х'=>"h",  'ц'=>"ts",  'ч'=>"ch", 'ш'=>"sh",  
    'щ'=>"shch",  'ъ'=>'',   'ь'=>'',    'ю'=>"yu", 'я'=>"ya",
    'Ё'=>"Yo",    'Х'=>"H",  'Ц'=>"Ts",  'Ч'=>"Ch", 'Ш'=>"Sh",
    'Щ'=>"Shch",  'Ъ'=>'',   'Ь'=>'',    'Ю'=>"Yu", 'Я'=>"Ya",
  ));
  return $st;
}
transliterate('Привет'); // Выводит привет
Далее внес данные в бд, поля, где должен был быть русский текст пустые, поля в кодировке utf8mb4_unicode_ci.
Но не думаю, что проблема в бд. Проблема где-то тут, при прочтении csv файла, так как функция транслита тоже некорректна отрабатывает.
PHP
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
header('Content-Type: text/html; charset=cp1251');
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
require_once 'configuration.php';
?>
 
<?php 
$row = 1;
$arr = [];
if (($handle = fopen("data.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        $row++;
        $arr[] = $data; 
      }
    fclose($handle);
}
 
function transliterate($st) {
    $st = strip_tags($st); 
  $st = str_replace(array("\n", "\r"), " ", $st);
  $st = preg_replace("/\s+/", ' ', $st);
  $st = trim($st);
  $st = mb_strtolower($st, 'CP1251');
  $st = strtr($st, 
    "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
    "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
  );
  $st = strtr($st, array(
    'ё'=>"yo",    'х'=>"h",  'ц'=>"ts",  'ч'=>"ch", 'ш'=>"sh",  
    'щ'=>"shch",  'ъ'=>'',   'ь'=>'',    'ю'=>"yu", 'я'=>"ya",
    'Ё'=>"Yo",    'Х'=>"H",  'Ц'=>"Ts",  'Ч'=>"Ch", 'Ш'=>"Sh",
    'Щ'=>"Shch",  'Ъ'=>'',   'Ь'=>'',    'Ю'=>"Yu", 'Я'=>"Ya",
  ));
  return $st;
}
 
 
$JConfig = new JConfig();
$mysqli = new mysqli($JConfig->host, $JConfig->user, $JConfig->password, $JConfig->db);
if ($mysqli->connect_errno) die("Connection Error."); 
 
$dbContent = $JConfig->dbprefix.'assets';
$result = $mysqli->query("SELECT max(`id`) FROM $dbContent");
$row = $result->fetch_array(MYSQLI_NUM);
$idLastAssests = $row[0];
 
$dbContent = $JConfig->dbprefix.'content';
$result = $mysqli->query("SELECT max(`id`) FROM $dbContent");
$row = $result->fetch_array(MYSQLI_NUM);
$idLastContent = $row[0];
 
$dbContentValues = $JConfig->dbprefix.'fields_values';
$dbContentAssests = $JConfig->dbprefix.'assets';
 
 
$arrQuery = array('title' => '', 'alias' => '', 'introtext' => '', 'fulltext' => '', 'catid' => 25, 'created_by' => 399, 'images' => '{"image_intro":"","float_intro":"","image_intro_alt":"","image_intro_caption":"","image_fulltext":"","float_fulltext":"","image_fulltext_alt":"","image_fulltext_caption":""}', 
'urls' => '{"urla":false,"urlatext":"","targeta":"","urlb":false,"urlbtext":"","targetb":"","urlc":false,"urlctext":"","targetc":""}', 'attribs' => '{"article_layout":"","show_title":"","link_titles":"","show_tags":"","show_intro":"","info_block_position":"","info_block_show_title":"","show_category":"","link_category":"","show_parent_category":"","link_parent_category":"","show_associations":"","show_author":"","link_author":"","show_create_date":"","show_modify_date":"","show_publish_date":"","show_item_navigation":"","show_icons":"","show_print_icon":"","show_email_icon":"","show_vote":"","show_hits":"","show_noauth":"","urls_position":"","alternative_readmore":"","article_page_title":"","show_publishing_options":"","show_article_options":"","show_urls_images_backend":"","show_urls_images_frontend":""}',
'metakey' => '', 'access' => 1, 'language' => '*');
$arrFields = array('1' => '', '2' => '', '3' => '', '4' => '', '5' => '', '6' => '', '109' => '', '104' => '01.02.2018 00:00:00', '103' => 1);
for ($i=0; $i < count($arr); $i++) { 
        $s = transliterate($arr[$i][0]);
        $arrQuery['title'] = $arr[$i][0];
        $arrQuery['alias'] = $s;
        $arrQuery['introtext'] = '<p>'.$arr[$i][1].'</p>';
        $arrQuery['fulltext'] = '<p>'.$arr[$i][2].'</p>';
        $arrQuery['metakey'] = $arr[$i][3];
        $arrFields['1'] = $arr[$i][5];
        $arrFields['2'] = $arr[$i][6];
        $arrFields['3'] = $arr[$i][7];
        $arrFields['4'] = $arr[$i][8];
        $arrFields['5'] = $arr[$i][9];
        $arrFields['6'] = $arr[$i][10];
        $arrFields['109'] = $arr[$i][4];
        $idLastAssests++;
        $idLastContent++;
        foreach ($arrFields as $key => $value) {
            $mysqli->query("INSERT INTO $dbContentValues SET `field_id` = '{$key}', `item_id` = '{$idLastContent}', `value` = '{$value}'");
        }
        $mysqli->query("INSERT INTO $dbContentAssests SET `parent_id` = '87', `lft` = '122', `rgt` = '123', `level` = '4', `name` = 'com_content.article.'.$idLastContent, `title` = {$arrQuery['title']}, `rules` = '{}'");
        $mysqli->query("INSERT INTO $dbContent SET `asset_id` = '{$idLastAssests}', `title` = '{$arrQuery["title"]}', `alias` = '{$arrQuery["alias"]}', `introtext` = '{$arrQuery["introtext"]}', `fulltext` = '{$arrQuery["fulltext"]}', `catid` = '{$arrQuery["catid"]}', `created_by` = '{$arrQuery["created_by"]}', `images` = '{$arrQuery["images"]}', `urls` = '{$arrQuery["urls"]}', `attribs` = '{$arrQuery["attribs"]}', `metakey` = '{$arrQuery["metakey"]}', `access` = '{$arrQuery["access"]}', `language` = '{$arrQuery["language"]}'");
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2019, 15:10
Ответы с готовыми решениями:

Неправильная кодировка
Уже целый день пытаюсь спарсить данные с сайта, но возникает проблема с кодировкой. Русские буквы отображаются в виде:...

Неправильная кодировка
страницы отображаются нормально я вижу нормально все но к примеру при проверке на pr-cr.r* в &lt;title&gt;&lt;/title&gt; , в ключевых...

Неправильная кодировка mail()
mail(&quot;mail@mail.ru&quot;, &quot;тема&quot;, &quot;текст сообщения&quot;); Тема приходит нормально, а текст сообщения на mail.ru приходит иероглифами. ...

17
 Аватар для TolikD
117 / 81 / 36
Регистрация: 30.07.2017
Сообщений: 371
31.10.2019, 15:20
Система какая? Винда?
Нужно смотреть PHP код в какой кодировке сохранился, затем сравнить в системе и оттуда плясать
1
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521
31.10.2019, 15:31  [ТС]
да винда

Добавлено через 23 секунды
Цитата Сообщение от TolikD Посмотреть сообщение
Нужно смотреть PHP код в какой кодировке сохранился, затем сравнить в системе и оттуда плясать
как это сделать?
0
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521
31.10.2019, 15:32  [ТС]
вот такое появляется
Миниатюры
Неправильная кодировка fgetcsv  
0
 Аватар для TolikD
117 / 81 / 36
Регистрация: 30.07.2017
Сообщений: 371
31.10.2019, 15:39
Цитата Сообщение от SolomonRei Посмотреть сообщение
как это сделать?
Винда полюбому кодировка win. Значит и файл надо сохранять в win. Делается это в настройках редактора PHP кода. Смотря каким пользуетесь. Однако базу лучше было бы делать тоже в кодировке win. Иначе нужно преобразовать в utf либо на входе, либо на выходе, либо и там и там )

Добавлено через 3 минуты
Цитата Сообщение от TolikD Посмотреть сообщение
Винда полюбому кодировка win.
Хотя не факт. Нужно версию винды и используемого веб-сервера.
1
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521
31.10.2019, 15:43  [ТС]
windows 10, open server, бд от joomla 3. Там кодировку никак не могу менять, иначе все полетит.

Добавлено через 37 секунд
я вот сейчас вывел die('Файл невозможно открыть, возможно его нет');
появляются кракозябры, это тоже с кодировкой связано,

Добавлено через 1 минуту
если убрать
PHP
1
header('Content-Type: text/html; charset=cp1251');
То die('Файл невозможно открыть, возможно его нет');
нормально отображается.
Как тут распутаться с этими кодировками)

Добавлено через 16 секунд
давай csv скину и скрипт сайм
0
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521
31.10.2019, 15:48  [ТС]
вот архив
Вложения
Тип файла: rar скрипт.rar (2.1 Кб, 5 просмотров)
1
 Аватар для TolikD
117 / 81 / 36
Регистрация: 30.07.2017
Сообщений: 371
31.10.2019, 16:05
Лучший ответ Сообщение было отмечено SolomonRei как решение

Решение

А, понятно. Убираем
PHP
1
#header('Content-Type: text/html; charset=cp1251');
Меняем
PHP
1
2
        $arr[] = $data; ----->
        $arr[] = mb_convert_encoding($data, "UTF-8", "CP1251");
Почему так?
1. PHP скрипт уже в utf
2. OpenServer работает в utf
3. База в utf
4. А csv файл то в win )
Следовательно, конвертируем csv в utf на входе и никаких головняков

Добавлено через 6 минут
Ах да, походу вот это дело тоже надо закоментить
PHP
1
#$st = mb_strtolower($st, 'CP1251');
1
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521
31.10.2019, 16:14  [ТС]
mb_convert_encoding() expects parameter 1 to be string, array given in /home/c/cc15628/smartkala.info/public_html/import.php on line 16

Добавлено через 43 секунды
у меня тут массив в массиве, чтобы разделить строки, в cvs, поэтому массив в массиве

Добавлено через 46 секунд
тогда может быть перебрать массив, сделать mb_convert_encoding, а потом его записать?

Добавлено через 3 минуты
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$arr = [];
$arr2 = [];
if (($handle = @fopen("data.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        $row++;
        for ($i=0; $i < count($data); $i++) { 
            $arr2[] = mb_convert_encoding($data[$i], "UTF-8", "CP1251");
        }
        $arr[] = $arr2;
      }
    fclose($handle);
}else die('Файл невозможно открыть, возможно его нет');
Добавлено через 10 секунд
переписал, заработало)
1
 Аватар для TolikD
117 / 81 / 36
Регистрация: 30.07.2017
Сообщений: 371
31.10.2019, 16:14
SolomonRei,
PHP
1
2
3
        if (is_array($data)) foreach ($data as &$val)
            $val = mb_convert_encoding($val, "UTF-8", "CP1251");
        $arr[] = $data;
1
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521
31.10.2019, 16:14  [ТС]
но теперь транслит некорректно отрабатывает
PHP
1
Z�ZlIMIOZGZeIFZu Z�ZbIOZlIKZsZbZA
0
 Аватар для TolikD
117 / 81 / 36
Регистрация: 30.07.2017
Сообщений: 371
31.10.2019, 16:15
Цитата Сообщение от SolomonRei Посмотреть сообщение
переписал, заработало)
Ага, хорошо что разобрался сам )
1
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521
31.10.2019, 16:17  [ТС]
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function transliterate($st) {
    $st = strip_tags($st); 
  $st = str_replace(array("\n", "\r"), " ", $st);
  $st = preg_replace("/\s+/", ' ', $st);
  $st = trim($st);
  $st = strtr($st, 
    "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
    "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
  );
  $st = strtr($st, array(
    'ё'=>"yo",    'х'=>"h",  'ц'=>"ts",  'ч'=>"ch", 'ш'=>"sh",  
    'щ'=>"shch",  'ъ'=>'',   'ь'=>'',    'ю'=>"yu", 'я'=>"ya",
    'Ё'=>"Yo",    'Х'=>"H",  'Ц'=>"Ts",  'Ч'=>"Ch", 'Ш'=>"Sh",
    'Щ'=>"Shch",  'Ъ'=>'',   'Ь'=>'',    'Ю'=>"Yu", 'Я'=>"Ya",
  ));
  return $st;
}
она у меня такая, может быть тут тоже где-то надо добавить что-то

Добавлено через 19 секунд
Цитата Сообщение от TolikD Посмотреть сообщение
Ага, хорошо что разобрался сам )
спасибо большое, а с транслитом не знаешь где проблема?
0
 Аватар для TolikD
117 / 81 / 36
Регистрация: 30.07.2017
Сообщений: 371
31.10.2019, 16:23
SolomonRei, проблема в многобайтовой кодировке, а strtr работает только в однобайтовой

Добавлено через 1 минуту
Надо использовать либо mb_strtr(), либо переписывать функцию transliterate с перебором без strtr
1
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521
31.10.2019, 16:52  [ТС]
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function transliterate($st) {
    $st = strip_tags($st); 
  $st = str_replace(array("\n", "\r"), " ", $st);
  $st = preg_replace("/\s+/", ' ', $st);
  $st = trim($st);
  $st = mb_strtolower($st);
  $st = mb_strtr($st, 
    "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
    "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
  );
  $arr = array(
    'ё'=>"yo",    'х'=>"h",  'ц'=>"ts",  'ч'=>"ch", 'ш'=>"sh",  
    'щ'=>"shch",  'ъ'=>'',   'ь'=>'',    'ю'=>"yu", 'я'=>"ya",
    'Ё'=>"Yo",    'Х'=>"H",  'Ц'=>"Ts",  'Ч'=>"Ch", 'Ш'=>"Sh",
    'Щ'=>"Shch",  'Ъ'=>'',   'Ь'=>'',    'Ю'=>"Yu", 'Я'=>"Ya",
  );
  $cl = 0;
  while ($cl < mb_strlen($st)) {
    if(array_key_exists($st[$cl], $arr)) 
        mb_strtr($st, $st[$cl], $arr[$st[$cl]]);
    $cl++;
  }
  return $string;
}
Добавлено через 13 секунд
вот так попробовал переписать

Добавлено через 15 секунд
Цитата Сообщение от SolomonRei Посмотреть сообщение
$st = mb_strtr($st,
* * "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОП РСТУФЫЭ",
* * "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOP RSTUFIE"
* );
тут все норм конвертятся

Добавлено через 31 секунду
а там где цикл while и поиск ключа массива
не очень

Добавлено через 8 секунд
тут опять дело в кодировке?
0
 Аватар для TolikD
117 / 81 / 36
Регистрация: 30.07.2017
Сообщений: 371
31.10.2019, 16:59
Цитата Сообщение от SolomonRei Посмотреть сообщение
тут опять дело в кодировке?
тут менять ничо не надо ))
PHP
1
2
3
4
5
6
    $st = strtr($st, array(
    'ё'=>"yo",    'х'=>"h",  'ц'=>"ts",  'ч'=>"ch", 'ш'=>"sh",  
    'щ'=>"shch",  'ъ'=>'',   'ь'=>'',    'ю'=>"yu", 'я'=>"ya",
    'Ё'=>"Yo",    'Х'=>"H",  'Ц'=>"Ts",  'Ч'=>"Ch", 'Ш'=>"Sh",
    'Щ'=>"Shch",  'Ъ'=>'',   'Ь'=>'',    'Ю'=>"Yu", 'Я'=>"Ya",
    ));
1
71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521
31.10.2019, 17:01  [ТС]
да реально, все спасибо тебе большое, выручил) Лучший
0
 Аватар для TolikD
117 / 81 / 36
Регистрация: 30.07.2017
Сообщений: 371
31.10.2019, 17:10
Кстате, только щас придумал третий вариант. Можно было бы в strtr() загнать все буквы в массив и было бы помуторней, но без mb_strtr()
PHP
1
$st = strtr($st, array('a'=>'a', ....
Однако, если начал работать с utf, то использовать mb-функции рано или поздно всё равно придется
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.10.2019, 17:10
Помогаю со студенческими работами здесь

Неправильная кодировка в теле письма
Здравствуйте, у меня такая проблема, юзеры получают письма вот в таком виде Ð'аш пароль был Ñброшен. Ðовый...

Неправильная кодировка при выводе из бд
Выводит знаки вопроса. В чём может быть причина? В phpmyadmin смотрю - русские буквы отображаются нормально. Дамп смотрю в редакторе...

Неправильная кодировка обратной связи
Код: &lt;?php /* Spark – Simple and Effective Rev. 6 */ // Replace the email address with the one that should receive...

Неправильная кодировка через анонимайзер
Не правильно отображается текст при заходе на сайт через анонимайзер на странице php пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ Кодировка...

Неправильная кодировка при парсинге
Привет всем. Извеняюсь, что создал ещё одну тему. Просто нужно решить одну проблему. Использую такой код. &lt;?php include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru