utf8 в ISO-8859-1 неправильно преобразовывает некоторые символы через Curl - PullRequest
3 голосов
/ 29 марта 2011

У меня есть приложение, которое принимает символы в кодировке UTF8 и должно отправить их как часть xml через curl с кодировкой ISO-8859-1.

Это мой тестовый код:

header('Content-Type: text/plain; charset=IS0-8859-1');

$message = '§ ° " @ # € % & / ( ) = + ` ´ ^ ¨ * - _ : . ; ,';

echo mb_convert_encoding($message, 'ISO-8859-1', 'UTF-8');

//build xml to post
$content =
    '<?xml version="1.0" encoding="ISO-8859-1"?>
    <mobilectrl_sms>
        <header>
            <customer_id>'.CUSTOMER_ID.'</customer_id>
            <password>'.PASSWORD_ID.'</password>
        </header>
        <payload>
            <sms account="'.SHORT_CODE.'">
                <message><![CDATA['.mb_convert_encoding($message, 'ISO-8859-1', 'UTF-8').']]></message>
                <to_msisdn>+12345678900</to_msisdn>
            </sms>
        </payload>
    </mobilectrl_sms>';

$posturl = MT_URL;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $posturl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml", "Content-length: ".strlen($content), "charset=ISO-8859-1"));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);

В браузере это почти работает, я вижу § ° "@ #?% & / () = +` ´ ^ ¨ * - _:.;,

обратите внимание на знак евро €

Но когда оно приходит в виде текстового сообщения, я вижу §? "@ #?% & / () = +??^?* - _:.;,

Я не могу понять это, я пробовал также utf8_decode, но, кажется, это еще хуже.Я что-то упустил?

Спасибо

Ответы [ 3 ]

4 голосов
/ 29 марта 2011

AFAIK, многобайтовое расширение не знает, как транслитерировать символы, такие как символ евро, но iconv() делает (пример кода из http://php.net/function.iconv#example-2228):

<?php
$text = "This is the Euro symbol '€'.";

echo 'Original : ', $text, PHP_EOL;
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo 'Plain    : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;

В приведенном выше примере будет выводиться нечто подобноеto:

Original : This is the Euro symbol '€'.
TRANSLIT : This is the Euro symbol 'EUR'.
IGNORE   : This is the Euro symbol ''.
Plain    :
Notice: iconv(): Detected an illegal character in input string in .\iconv-example.php on line 7
This is the Euro symbol '

Обратите внимание на использование iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), которое транслитерирует символ '€' в его "латинский-1" эквивалент "EUR".

3 голосов
/ 29 марта 2011

В ISO-8859-1 нет знака евро, поэтому он заменяется знаком вопроса. Вы ничего не можете с этим поделать, кроме как выбрать что-то другое, чтобы заменить его.

То же самое относится и к другим персонажам, которые конвертируются в ? с.

1 голос
/ 20 июня 2011

Некоторые протоколы SMS принимают знак «% 80» для знака евро. Таким образом, вы можете попробовать заменить "€" на "% 80" и кодировать URL остальной части строки, используя ISO-8859-1. У меня это работало для некоторых протоколов SMS.

...