You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对PHP数组进行Windows-1252转UTF-8的跨字符集单元测试?

解决Windows-1252转UTF-8单元测试乱码问题

我一眼就看出问题出在测试用例的输入构造错误上,咱们一步步拆解解决:

问题根源

你的转换函数是把Windows-1252编码的字节流转成UTF-8,但你在单元测试里传入的$convertedArray里的Description已经是UTF-8格式的正确字符串("an example pain— if you’re"),而不是真正的Windows-1252编码原始内容。

当你把UTF-8字符串当作Windows-1252编码来转码时,相当于做了一次二次编码,自然就会出现an example painâ€â€� if you’re这种乱码。

分步解决方案

1. 先修正转换函数的笔误

你函数里的retrun是拼写错误,先改成return,不然函数根本没法正常返回结果:

function test($article){ 
  $result = mb_convert_encoding($article[0]['Description'], "UTF-8", "Windows-1252"); 
  return $result; // 修正拼写错误
}

2. 构造正确的Windows-1252测试输入

要得到真正的Windows-1252编码字符串,最可靠的方式是把你预期的UTF-8结果反向转换成Windows-1252编码:

// 把目标UTF-8字符串转成Windows-1252编码的字节,作为测试输入
$originalWin1252Str = mb_convert_encoding("an example pain— if you’re", "Windows-1252", "UTF-8");

这个$originalWin1252Str就是你提到的"an example pain— if you’re"(它本质是Windows-1252字节在UTF-8环境下显示的乱码)。

3. 调整单元测试代码

把测试用例的输入换成正确的Windows-1252字符串,然后添加断言验证转换结果:

// 构造正确的测试输入数组
$testArray = array(array('Description' => $originalWin1252Str));

$mockClient = $this->getMockBuilder('\Client')
    ->setMethods(['getArticle'])
    ->getMock(); 
$mockClient->expects($this->once())
    ->method('getArticle')
    ->with('12345')
    ->will($this->returnValue($testArray)); 
\Client::set($mockClient);

// 执行转换并验证结果
$convertedResult = test($testArray);
$this->assertEquals("an example pain— if you’re", $convertedResult);

额外注意点

  • 确保你的PHP环境已经启用了mbstring扩展,没有它mb_convert_encoding根本没法工作。
  • 如果想直接硬编码Windows-1252字符串,一定要保证你的代码文件本身是UTF-8编码,否则硬编码的字符串编码会混乱,还是用反向转换的方式更稳妥。

内容的提问来源于stack exchange,提问作者DonOfDen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:00:13