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

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

31.10.2019, 15:10. Показов 4640. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru