在Docker容器中,文件字符集变为二进制

11

我有一个应用程序,每小时监听外部信息源并接收分块传输编码流的JSON数据。监听器会将每个数据块写入文件中,当整个流程完成后,另一个线程会解析该文件并提取数据。但现在,尽管我已经指定了字符集,但在写入文件时,数据以二进制格式写入。

    public void writeToFile(InputStream in){
     File feedFile = new File("/tmp/feed.json");
    try {
        FileUtils.touch(feedFile);
        StringWriter writer = new StringWriter();
        IOUtils.copy(in, writer, StandardCharsets.UTF_8);
        FileUtils.write(feedFile, writer.toString(), StandardCharsets.UTF_8,true);

    } catch (IOException e) {
        logger.error(Constants.FAILED_TO_WRITE_FEED_INTO_FILE,e);
    }
}

这段代码在Windows和Linux上运行良好,但在Docker容器中运行时以二进制格式编写。

Docker容器使用的是Centos7操作系统。


注:保留了原文的HTML标签。

@TarunLalwani 我已经打印出当前编码: { "默认字符集:": "UTF-8", "默认编码:": "UTF8", "默认区域设置:": "en_US", "文件编码:": "UTF-8", "sun.jnu编码:": "UTF-8" } - Brajesh Pant
@bratkartoffel,我已经尝试了这里建议的方法,还在网上进行了UTF-8编码问题的研究,但我不确定为什么字符串编码会发生变化。 - Brajesh Pant
请提供一个最小的代码库以调试和重现此问题。 - Tarun Lalwani
1
我怀疑你正在检索一个压缩的数据源。 - teppic
你找到解决方案了吗? - Paul Rey
显示剩余9条评论
2个回答

1
也许容器中不存在UTF-8语言环境?您可以通过cat /etc/locale.conf命令查看运行容器的当前语言环境。如果不是LANG=en_US.utf8,您可以按照this StackOverflow post by user2915097的说明进行操作。
# Set the locale
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
    locale-gen
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8

Source: How to set the locale inside a Ubuntu Docker container? https://dev59.com/p14c5IYBdhLWcg3wCGVJ#28406007

编辑 1:

你应该使用InputStreamReader而不是InputStream,因为:

  • InputStream用于处理二进制数据
  • InputStreamReader用于处理文本

你可以在这里找到更多信息。


[root@f9d5003f866d tmp]#cat /etc/locale.conf LANG="en_US.UTF-8"它存在,我也正在使用Centos7。 - Brajesh Pant
我知道我在Ubuntu上链接了一个有关字符集的帖子,但它的工作方式是相同的。我编辑了我的答案,提供了另一种方法。 - Paul Rey
我确实使用了InputStreamReader,但没有成功。 - Brajesh Pant

0

你可以在你的 Dockerfile 中尝试这个

ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

它遵循了你收到的其他评论的相同思路,但使用了Docker自己的机制。


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