双子神经机器学习Java版提示:无法读取西里尔字母

3
我已经下载了初学者IVR教程,并稍作修改以提供俄语语音响应(java文件的编码为UTF-8):
@Override
protected void doPost(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
        throws IOException {
    VoiceResponse response = new VoiceResponse.Builder()
            .gather(new Gather.Builder()
                    .action("/menu/show")
                    .numDigits(1)
                    .build())
            .say(new Say.Builder("Привет")
                  .voice(Say.Voice.ALICE)
                  .language(Say.Language.RU_RU)
                  .build())
            .build();

    servletResponse.setContentType("text/xml");
    try {
        servletResponse.getWriter().write(response.toXml());
    } catch (TwiMLException e) {
        throw new RuntimeException(e);
    }
}

然而,当我拨打我的号码时,我听到了寂静。控制台的通话记录显示问号而不是西里尔字符。

enter image description here

我需要帮助解决这个问题。


1
请尝试在响应中显式设置字符集(UTF8),并可能更喜欢“application/xml”而不是“text/xml”(前者意味着ASCII [参见](http://www.grauw.nl/blog/entry/489))...如果您有一个记录器(并且信任其utf-8功能:),请记录`response.toXml()`。 - xerx593
感謝 @xerx593 的反饋。試過了 application/xml - 結果仍然一樣。Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.WARNING, response.toXml()) 能夠正常印出預期的俄文字串(在 Mac OS 终端上)。但有一件事我不是很明白:我使用 Byte Encodings and Strings 中的 printBytes() 方法印出字符編碼,卻得到了以下結果:0xd0 0x9f 0xd1 0x80 0xd0 0xb8 0xd0 0xb2 0xd0 0xb5 0xd1 0x82 (應該是 "Привет" 的 0x04 0x1F 0x04 0x40 0x04 0x38 0x04 0x32 0x04 0x35 0x04 0x42)。 - Nikolay Mamaev
已将响应的内容类型恢复为 text/xml - 仍然可以正常工作。即响应的编码方式有误。 - Nikolay Mamaev
1个回答

2

看起来,你“只需要”:

最初的回答是:

servletResponse.setCharacterEncoding("UTF-8");

..or:

servletResponse.setContentType("text/xml; charset=UTF-8");

由于默认假定为ISO-8859-1编码,因此需要更改HttpServletResponse的编码。(我对TwiML或IVR不是很熟悉,但这似乎在基本层面上会导致(西里尔字母)的问题。)

参考文献:

"最初的回答"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接