PHP проблема с китайскими иероглифами - PullRequest
0 голосов
/ 03 марта 2020

Я перепробовал все возможные решения, перечисленные в SOF, но у меня не работает ни одно решение (возможно, я делаю что-то неподходящее) . Недавно я обновил свою инфра-инфраструктуру, обновил ее с PHP 5 до PHP 7, а затем запустил проблему, старая инфра-инфраструктура по-прежнему отображала все китайские иероглифы, но не проблема, но на PHP 7 у меня проблема. На нем отображаются только вопросительные знаки и несколько китайских символов, например 广?????运货运代?????????????????司

MariaDB

'character_set_client','utf8'
'character_set_connection','utf8'
'character_set_database','utf8'
'character_set_filesystem','binary'
'character_set_results','utf8'
'character_set_server','utf8'
'character_set_system','utf8'
'character_sets_dir','c:\\mariadb\\share\\charsets\\'

Данные таблицы MariaDB

'4181','é“甲兵户外','TB0001',NULL,'2016-06-04 18:21:35',NULL,NULL
'4188','é“甲兵户外','TB0001',NULL,'2016-06-04 18:24:20',NULL,NULL
'4221','é“甲兵户外(TB0001)','TB0001',NULL,'2016-06-05 05:09:49','2016-08-24 06:54:57',NULL
'204424','广州凌è¿è´§è¿ä»£ç†æœåŠ¡æœ‰é™å…¬å¸',NULL,NULL,'2019-07-09 00:13:43','2020-02-19 10:08:21',NULL

Таблица определения Maria DB

CREATE TABLE `companies` (
  `entity_id` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
  `reg_no` varchar(30) DEFAULT NULL,
  `website_url` varchar(100) DEFAULT NULL,
  `created` datetime NOT NULL,
  `updated` datetime DEFAULT NULL,
  `external_id` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`entity_id`),
  KEY `fk_companies_1_idx` (`entity_id`),
  FULLTEXT KEY `ft_1` (`reg_no`),
  CONSTRAINT `FK_8244AA3A81257D5D` FOREIGN KEY (`entity_id`) REFERENCES `entities` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

PHP 7 Вход

header('Content-type: text/html; charset=utf-8');

$conn = new mysqli($host, $username, $password, $dbname) or die("Connect failed: %s\n". $conn -> error);

$query = "SELECT * FROM companies where entity_id = 4188";
$result = $conn->query($query);
$row = mysqli_fetch_assoc($result);

$name = $row["name"];
echo "\n";
echo $name;
echo "\n";
echo utf8_decode($name);
echo "\n";
echo iconv('UTF-8', 'ISO-8859-1', $name);
echo "\n";
echo mb_convert_encoding($name, 'ISO-8859-1', 'UTF-8');
echo "\n";
echo  utf8_decode($name);

PHP 7 Выход


é“甲兵户外
??????????????

??????????????
??????????????

Это мой старый инфра

PHP 5 Вход

header('Content-type: text/html; charset=utf-8');
$conn = new mysqli($host, $username, $password, $dbname) or die("Connect failed: %s\n". $conn -> error);

$query = "SELECT * FROM companies where entity_id = 4188";//204424";
$result = $conn->query($query);
$row = mysqli_fetch_assoc($result);
$name = $row["name"];
echo $name;

PHP 5 Вывод

铁甲兵户外

На обоих интерфейсах я использую одну и ту же базу данных, но как-то на старой инфраструктуре вывод в порядке без какого-либо преобразования utf или латинский.

1 Ответ

0 голосов
/ 17 марта 2020

甲兵户外 - это моджибаке для 甲兵户外

Моджибаке происходит, когда что-то неправильно указывает latin1 (или какой-то неправильный набор символов).

Для китайского языка вам нужно utf8mb4 , не подразумевайте utf8.

Не используйте никакие кодировщики / декодеры, только только испортите ситуацию.

Для отладки используйте hex. В MySQL используйте SELECT col, hex(col) ...

Подробнее о "передовой практике", Моджибаке и др. c: Проблема с символами UTF-8; то, что я вижу, не то, что я сохранил

...