将字符转换为UTF-8

时间:2011-02-11 11:07:37

标签: java encoding utf-8 character-encoding junit

在我的单元测试中,我试图证明发送到客户端应用程序的HTTP响应只包含有效的UTF-8字符。这是因为英镑符号“£”未作为UTF-8编码字符发送,导致客户端应用程序验证失败。

在我的测试中,我正在做以下事情:

// setup
byte[] outputData = "£".getBytes("ISO-8859-1");
String serviceXmlResponse = String.format("<?xml version=\"1.0\" encoding=\"utf-8\" ?><some>%s</some>", outputData.toString());
String expectedXmlContent = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><some>£</some>";
when(service.getMessage()).thenReturn(serviceXmlResponse);

// act
ModelAndView result = controller.handlePostRequest(request, response, mav);

// assert
assertEquals(expectedXmlContent, result.getModel().get(ApplicationController.RESPONSE_KEY));

结果XML包含:

<?xml version="1.0" encoding="utf-8" ?><some>[B@1164b9b6</some>

我在这里做错了什么? 感谢

2 个答案:

答案 0 :(得分:2)

如果service.getMessage()将您的XML作为String返回,而result.getModel().get(ApplicationController.RESPONSE_KEY)byte[]的编码形式返回相同的XML,则您的测试应如下所示:

String serviceXmlResponse = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><some>£</some>";
when(service.getMessage()).thenReturn(serviceXmlResponse);

assertArrayEquals(serviceXmlResponse.getBytes("UTF-8"), (byte[]) result.getModel().get(ApplicationController.RESPONSE_KEY));

否则,您的测试没有多大意义,特别是如果result.getModel().get(ApplicationController.RESPONSE_KEY)返回String,那么在生成模型属性后,视图中会应用实际编码。

另见:

答案 1 :(得分:1)

[B是您在toString()数组上致电byte时获得的。

所以你的测试不起作用,因为它基本上说:“调用getMessage()时返回预期的输出”。所以它测试assertEquals (expected, expected);

您的问题出在代码中,该代码从套接字读取XML字节,然后将它们转换为service.getMessage()

返回的字符串

所以你的代码必须如下:

String expectedXmlContent = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><some>£</some>";
byte[] data = expectedXmlContent.getBytes("UTF-8");

... send data to service as byte stream ...

assertEquals(expectedXmlContent, service.getMessage());

也不要混合编码;如果XML显示“UTF-8”,则必须在getBytes()中使用相同的编码。