utf8_encode или декодирование не делают то, что я ожидаю

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

XML-файл начинается

<?xml version="1.0" encoding="UTF-8"?>

Затем примером того, где у меня есть проблемы, является эта часть

<name><![CDATA[PONS Großwörterbuch Deutsch als Fremdsprache Android]]></name>

Мой PHP имеет этот соответствующий раздел

$dom = new DOMDocument();
$domNode = $xmlReader->expand();
$element = $dom->appendChild($domNode);
$domString = utf8_encode($dom->saveXML($element));
$product = new SimpleXMLElement($domString);

//read in data
$arr = $product->attributes();
$link_ident = $arr["id"];
$link_id =  $platform . "" . $link_ident;
$link_name = $product->name;

Таким образом, $link_name становится МОСТОМ Альс GroÃwörterbuch Deutsch Fremdsprache Android

Я затем сделал a

$link_name = utf8_decode($link_name);

Который, когда я отреагировал в терминале, хорошо работал

PONS GroÃwörterbuch Deutsch als Fremdsprache Android as is now 
PONS Großwörterbuch Deutsch als Fremdsprache Android after utf8decode 

Однако, когда это записано в мою базу данных, это появляется как:

МОСТ (Android) Kompaktwörterbuch Deutsch-Englisch

Сопоставление для link_name в MysQL является utf8_general_ci

Как я должен делать это для записания его правильно в мою базу данных?

Это - код, который я использую для записи в базу данных

$link_name = utf8_decode($link_name);
$link_id = mysql_real_escape_string($link_id);
$link_name = mysql_real_escape_string($link_name);
$description = mysql_real_escape_string($description);
$metadesc = mysql_real_escape_string($metadesc);
$link_created = mysql_real_escape_string($link_created);
$link_modified = mysql_real_escape_string($link_modified);
$website = mysql_real_escape_string($website);
$cost = mysql_real_escape_string($cost);
$image_name = mysql_real_escape_string($image_name);
$query = "REPLACE into jos_mt_links
(link_id, link_name, alias, link_desc, user_id, link_published,link_approved, metadesc, link_created, link_modified, website, price)
VALUES ('$link_id','$link_name','$link_name','$description','63','1','1','$metadesc','$link_created','$link_modified','$website','$cost')";
echo $link_name . " has been inserted ";

и когда я выполняю его от оболочки, я вижу

PONS Kompaktwörterbuch Deutsch-Englisch (Android) has been inserted
1
задан hakre 25 December 2012 в 00:34
поделиться

2 ответа

У вас есть строка UTF-8 из файла XML, и вы помещаете ее в базу данных UTF-8. Таким образом, не нужно выполнять кодирование или декодирование, просто вставьте исходную строку в базу данных. Убедитесь, что вы сначала использовали mysql_set_charset ('utf-8') , чтобы сообщить базе данных о поступающих строках UTF-8.

utf8_decode и utf8_encode названы неверно. Они только для преобразования между кодировками UTF-8 и ISO-8859-1. Вызов utf8_decode , который преобразуется в ISO-8859-1, естественным образом приведет к потере всех имеющихся у вас символов, не подходящих для этой кодировки. Обычно вам следует избегать этих функций, если нет определенного места, где вам нужно использовать 8859-1.

Вы не должны рассматривать то, что терминал показывает, когда вы выводите строку, как окончательную. Терминал имеет свои собственные проблемы с кодировкой, и особенно в Windows, вероятно, будет невозможно правильно вывести каждый символ. В западной версии Windows кодовая страница системы (которую терминал будет использовать для преобразования байтов, выводимых PHP в символы для отображения на экране) будет кодовой страницей 1252, которая похожа на ISO-8859-1, но не совпадает с ней. . Вот почему utf8_decode , который выводит ISO-8859-1, заставляет текст выглядеть так, как вы ожидали. Но от этого мало толку. Внутри вы должны использовать UTF-8 для всех строк.

1
ответ дан 2 September 2019 в 23:30
поделиться

Перед записью в базу данных необходимо использовать функцию mb_convert_encoding или iconv.

1
ответ дан 2 September 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: