PHP函数iconv字符编码从iso-8859-1到utf-8

PHP函数iconv字符编码从iso-8859-1到utf-8,php,utf-8,character-encoding,iconv,Php,Utf 8,Character Encoding,Iconv,我正在尝试将字符串从iso-8859-1转换为utf-8。 但是当我找到这两个字符时,函数返回 里面有两个数字的正方形字符 如何解决此问题?iso-8859-1不包含欧元符号,因此如果包含欧元符号,则无法使用iso-8859-1解释您的字符串。请改用iso-8859-15。这两个字符在iso-8859-1中是非法的(您是指iso-8859-15吗?) 我认为您正在寻找的编码是(西欧)。与ISO-8859-1(或8859-15)不同;0xA0-0xFF范围内的字符与8859-1匹配,但cp1252

我正在尝试将字符串从iso-8859-1转换为utf-8。 但是当我找到这两个字符时,函数返回 里面有两个数字的正方形字符


如何解决此问题?

iso-8859-1不包含欧元符号,因此如果包含欧元符号,则无法使用iso-8859-1解释您的字符串。请改用iso-8859-15。

这两个字符在iso-8859-1中是非法的(您是指iso-8859-15吗?)


我认为您正在寻找的编码是(西欧)。与ISO-8859-1(或8859-15)不同;0xA0-0xFF范围内的字符与8859-1匹配,但cp1252在0x80-0x9F范围内添加了一系列额外字符,其中ISO-8859-1分配了很少使用的控制代码

产生这种混乱是因为当您将页面作为
text/html;charset=iso-8859-1
,由于历史原因,浏览器实际上使用cp1252(因此也将使用cp1252提交表单)


始终先检查编码!您永远不应该盲目相信您的编码(即使它来自您自己的网站!):


请显示一些代码和示例数据。中不包含字符
。那你用什么编码呢?谢谢你bobince!现在它起作用了。我现在想问你另一个问题。如何检查设置为text/html的所有站点;charset=iso-8859-1是否真的在cp1252中?(你是如何在回答中解释的)。如果你看到一个字节在0x80–0x9F范围内,你几乎肯定看到的是cp1252而不是8859-1,因为“C1控制代码”很少使用(在网络上几乎从未使用过)。如果“ISO-8859-1”字符串的来源是基于网络的,那么几乎可以肯定这意味着它实际上是cp1252,因为浏览器就是这样使用的;然后使用相同的字符串mb_detect_编码($string,'ISO-8859-1');第一个返回“false”,第二个返回它是ISO-8859-1字符串。但事实并非如此。如何进行特定的字符集检查?您根本无法进行特定的字符集检查。绝对任何字节序列都是有效的ISO-8859-1字符串,大多数单字节编码也将所有或大部分字节映射为有效字符。只有像UTF-8这样的多字节编码(其中存在许多无效字节序列)才有可能排除它们。所以,实际上,你只能在概率上保持平衡,当cp1252与ISO-8859-1对来自网络的文本进行比较时,概率的平衡总是cp1252。没有•”的代码点。它必须是。很可能是的,“必须”是一个有点强的措辞(有多个字符集既有€又有•)。只要人们知道自己的输入字符集,
iconv
解决方案就保持不变。这一点很好!然后我又回到我之前的说法,ISO-8859-1没有子弹。那么•?是的,不是。
$ php -r 'echo iconv("utf-8","iso-8859-1//TRANSLIT","ter € and • the");'
ter EUR and o the
iconv('cp1252', 'utf-8', "\x80 and \x95")
-> "\xe2\x82\xac and \xe2\x80\xa2"
function convert_cp1252_to_utf8($input, $default = '') {
    if ($input === null || $input == '') {
        return $default;
    }

    // https://en.wikipedia.org/wiki/UTF-8
    // https://en.wikipedia.org/wiki/ISO/IEC_8859-1
    // https://en.wikipedia.org/wiki/Windows-1252
    // http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
    $encoding = mb_detect_encoding($input, array('Windows-1252', 'ISO-8859-1'), true);
    if ($encoding == 'ISO-8859-1' || $encoding == 'Windows-1252') {
        /*
         * Because ISO-8859-1 and CP1252 are identical except for 0x80 through 0x9F
         * and control characters, always convert from Windows-1252 to UTF-8.
         */
        $input = iconv('Windows-1252', 'UTF-8//IGNORE', $input);
    }
    return $input;
}