PHP mb_convert_encoding 问题记录

本文探讨了在使用mb_convert_encoding函数处理转码时遇到特殊符号丢失的问题,并提供了一个通过先替换特殊字符再进行转码的解决方案。同时,对比了iconv函数在处理相同问题时的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现了这样一个问题,在使用mb_convert_encoding 这个函数转码时,一些特殊符号(™©®)被干掉了,替换成了问号。

然后尝试先进行替换,在转码。

代码如下

$arr = array(
            chr(0x99) => '™', //转gbk小心
            chr(0xA9) => '©',
            chr(0xAE) => '®',
        );
mb_convert_encoding(strtr($str,$arr),'gbk','utf-8');

但是还是有问题,主要问题还是出在™ 这货上。

PS:

  • mb_convert_encoding 转™会出现?
  • iconv 加入//ignore 则不会
  • mb_detect_encoding 函数获取该字符串(™)编码 是’ISO-8859-2’

暂时记录

### PHP `mb_convert_encoding` 函数使用方法 #### 函数定义与基本语法 `mb_convert_encoding` 是一个多字节字符串编码转换函数,在处理不同字符集间的转换时非常有用。此函数可以将给定的字符串按照指定的目标编码进行转换[^1]。 ```php string mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding ] ) ``` - `$str`: 需要被转换编码的原始字符串。 - `$to_encoding`: 转换后的目标编码格式,比如 'UTF-8' 或者其他支持的编码形式。 - `$from_encoding`: 可选参数;如果提供,则表示源字符串所使用的具体编码类型。也可以是一个数组来尝试多种可能的输入编码。 #### 实际应用案例 当遇到网页抓取或其他场景下的文本数据存在未知或不一致的编码情况时,可以通过如下方式解决问题: 假设有一个来自外部资源的内容可能是GB2312编码,现在希望将其转为统一的标准UTF-8编码以便后续操作: ```php $originalContent = file_get_contents('http://example.com/page'); // 获取页面内容 // 尝试从 GB2312 到 UTF-8 的转换 $convertedContent = mb_convert_encoding($originalContent, "UTF-8", "GBK"); echo htmlspecialchars($convertedContent); // 输出并防止XSS攻击 ``` 这段代码展示了如何利用 `mb_convert_encoding()` 来确保获取到的数据是以期望的形式呈现出来的[^3]。 #### 常见问题解决方案 对于一些特定情况下可能出现的问题,这里给出几个实用技巧: ##### 无法识别原编码怎么办? 有时并不清楚确切的初始编码是什么样的时候,可以直接传递一个包含多个候选编码类型的列表作为第三个参数,让PHP自动检测最合适的那个: ```php $textWithUnknownEncoding = "..."; // 不明编码的文字串 $supportedEncodings = ["ASCII", "JIS", "EUC-JP", "SJIS", "UTF-8"]; $resultText = mb_convert_encoding($textWithUnknownEncoding, "UTF-8", $supportedEncodings); ``` 这样即使不确定原来的编码也能较好地完成转换过程。 ##### 处理HTML实体化输出 为了避免潜在的安全风险(如跨站脚本漏洞),通常会在显示之前先对特殊字符做适当转义: ```php $safeOutput = htmlspecialchars(mb_convert_encoding($unsafeInput, "UTF-8"), ENT_QUOTES | ENT_HTML5, "UTF-8"); print($safeOutput); ``` 通过这种方式既实现了编码标准化又增强了安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值