java - 字符集未正确应用

标签 java

我有一个 Spark Java Web 服务,可以接收 UTF-8 格式的请求。当收到扩展字符(如变音符号或带波形符的字母)时,它们在转换为字符串时无法正确包含正确的字符。调试:

1) 我收到请求并将其字节显示为十六进制值(这包含正确的字符)。

2) 然后我将接收到的字节转换为字符串(指定 UTF-8 的字符集)。

3) 最后,我再次将步骤 2 中的字符串显示为十六进制值。

不幸的是,步骤 1 中的十六进制值与步骤 3 中的十六进制值不匹配。以下是我正在使用的代码:

    byte[] bytes = request.bodyAsBytes();


    LOGGER.debug( "1 - Body as bytes: " );
    LOGGER.debug( javax.xml.bind.DatatypeConverter.printHexBinary(bytes) );
    LOGGER.debug( "1 - End of body" );

    //  charset hard coded to UTF-8 for testing...
    String charSet = requestHeadersDto.getCharacterSet().equals( "" ) ? DEFAULT_CHAR_SET : requestHeadersDto.getCharacterSet();
    LOGGER.debug( "Charset: " + charSet );
    String xml = new String( bytes , charSet );


    LOGGER.debug( "2 - Body as bytes: " );
    LOGGER.debug( javax.xml.bind.DatatypeConverter.printHexBinary( xml.getBytes() ) );
    LOGGER.debug( "2 - End of body" );

我做错了什么? TIA。

最佳答案

xml.getBytes()

应该是:

xml.getBytes(charSet)

xml.getBytes(Charset.forName(charSet))

关于java - 字符集未正确应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51070602/

相关文章:

java - 如何重构这个开关盒

java - Spring Boot 管理服务器 : App Specific Email Notification

java - Google App Engine 中的默认凭据 : Invalid Credentials error

java - JSP 页面是/否对话框

c# - 四 View 编辑器应用的最佳 3D 引擎/软件

java - 日期和时间解析

java - LambdaMessageProcessor 无法识别 ConversionService 的负载类型

java - IntelliJ 对 Cucumber 4.7 的支持

java - 绘制的字符串(使用drawString)闪烁

java - 如何访问作为线程的一部分发生的异常信息?