UTF8转换为ISO-8859-1在通过Curl时不能正确转换一些字符

3

我有一个应用程序,它接收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
据我所知,多字节扩展无法转换诸如欧元符号之类的字符,但是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;

上述示例将输出类似以下内容:
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)将'€'字符转换为其Latin-1的“等价”字符'EUR'。此处涉及的是IT技术相关内容。

3

ISO-8859-1中没有欧元符号,因此它被替换为问号。除了选择其他替代符号,您无法做任何事情。

同样适用于转换为?的其他字符。


1
这就是为什么ISO-8859-*被认为是遗留的,而UTF-8/16被认为是可用标准中明智和现代的选择。 - Quentin
谢谢你的回答,我得看看将这些字符转换为接近的内容。这是为了一个短信应用程序,显然很多运营商的GSM仍然使用ISO-8859,而且这是在欧洲!我想没有人能够发送欧元符号的短信。 - bones

1
一些短信协议接受"%80"作为欧元符号。因此,您可以尝试用"%80"替换"€",并使用ISO-8859-1对字符串的其余部分进行URL编码。对于某些短信协议,这对我有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接