【问题标题】:Crontab changing the character encoding on a jar executionCrontab 更改 jar 执行时的字符编码
【发布时间】:2012-06-24 04:31:45
【问题描述】:

我有一个用 Java 编写的网络爬虫软件,它可以遍历任何给定的网站并收集数据。到目前为止,一切都很好。我使用 JSoup API 是为了方便,但这无关紧要。我的问题在于编码。

当我在服务器上运行 Jar 文件时(使用 java -jar Crawler.jar),它可以完美地捕获数据 - 包括国际重音,如 á、é 等等。但是...当我通过 crontab 安排它时,它只会搞砸每个非基本字符!这里可能是什么问题?我真的很茫然,一个答案真的会拯救我的皮肤。

编辑 - 一位朋友建议我使用以下代码检查 Cron 上运行的语言环境:

    */1 * * * * locale > /home/user/locale.ouput

我做到了,而且似乎 crontab 使用的是 POSIX 语言环境,而不是系统设置,即 UTF-8。我将看看如何将其更改为 UTF-8。任何提示将不胜感激!

【问题讨论】:

  • 请看我的回答。这就是您设置语言环境的方式。变量是“lang”,但这是您问题的语言环境的相关部分。

标签: java character-encoding jsoup crontab


【解决方案1】:

在将字节转换为字符或从字符转换为字符时,显式设置字符编码。比如String构造函数中,String.getBytes(),InputStreamReader构造函数等

如果这还不够,请在启动 Java 之前尝试在 crontab 中将 LANG 环境变量设置为不同的值。例如,您可以使用

LANG=en_US.UTF-8

【讨论】:

  • 具体来说,作为一项规则,您希望在 cron 作业中明确使用所有环境变量,因为它们开始的值往往非常有限。对 cron 任务中的环境变量不做任何假设,在脚本中适当地设置它们。
  • 这对我有帮助。不过,我并没有真正了解设置变量 INSIDE cron 的那部分内容。我所做的是编辑 /etc/environment 文件,并添加 LANG=pt_BR.UTF8 (en_US 不工作,出于某种原因!),然后重新启动 cron 服务。那成功了。不过,最好只为 Java 设置变量,因为系统上运行着其他东西,并且更改每一个的全局设置可能会导致问题。
【解决方案2】:

好的,所以我假设如果您在生产服务器上测试它,您正在使用 ssh 或类似工具远程运行它并在终端模拟器上查看结果。

Java 显然是 unicode,所以这听起来像是一个 unicode-ascii 问题。如果服务器将这些写入文本文件,则输出编码与在终端上呈现的方式之间可能存在某种差异。

如果您将其设置为写入文件,我首先要做的是尝试使用不同的终端仿真器,以确保文本不会被非 unicode 仿真器弄乱。如果这不是问题,您可能需要仔细检查文件本身的字符编码,并确保软件没有某种隐藏问题。

理想情况下,您只需在物理服务器上打开一个 tty 并以这种方式查看输出和字符编码,但这并不总是方便或可行。

我也遇到过类似的乱码文本问题,而且几乎总是归结为终端模拟器的问题。

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 2016-07-22
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多