71 / 55 / 32
Регистрация: 13.04.2018
Сообщений: 521

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

31.10.2019, 15:10. Показов 4697. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru