如何对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
相关产品推荐
相关产品推荐

