Java 时间戳 unicode 问题

Java Time Stamp unicode issue

虽然我试图将时间戳作为参数传递给 post 请求,但在阿拉伯语手机等上,它似乎将其转换为 unicode 而不是 long。谁能给我解释一下这背后的理论。

这就是我生成时间戳字符串的方式。

String timeStampString = String.format("%d",System.currentTimeMillis()/ 1000L);

但是在服务器上我得到的是 '\xd9\xa1\xd9\xa4\xd9\xa3\xd9\xa0\xd9\xa4\xd9\xa1\xd9\xa8\xd9 \xa8\xd9\xa2\xd9\xa0'.

这样的 unicode 字符串

只需使用 String.valueOf(long) 即可:

String timeStampString = String.valueOf(System.currentTimeMillis() / 1000L);

String.format 不同,它将始终使用 "regular" 数字“0”到“9”进行格式化。

Formatter class 由 String.format()PrintWriter.format()PrintWriter.printf() 使用,是区域设置敏感的。

这意味着如果您没有给它明确的区域设置,它将根据默认区域设置格式化数字。

如果区域设置语言是阿拉伯语,根据所使用的区域设置提供程序,数字格式可能使用 "pure Arabic".

的数字

例如,拿这个小代码片段来说:

    int i = 1234567890;

    System.out.printf( "%d%n", i);
    Locale locale = new Locale("ar");
    System.out.printf( locale, "%d%n", i);

当语言环境提供程序是默认的 ("JRE") 时,它显示:

1234567890
1234567890

但是如果我 运行 它与扩展的语言环境提供程序,就像这样:

java -Djava.locale.providers=CLDR SimpleTest

我得到的输出是:

1234567890
١٢٣٤٥٦٧٨٩٠

您在 post 参数中看到的是这些纯阿拉伯数字的 UTF-8 表示。

一个简单的解决方案是使用明确的语言环境。而不是使用

String.format("%d",System.currentTimeMillis()/ 1000L);

使用英语语言环境,您一定会得到英语(见注释) 位。

String.format(Locale.ENGLISH, "%d",System.currentTimeMillis()/ 1000L);

或者简单地使用不区分语言环境的 String.valueOf(System.currentTimeMillis()/ 1000L)Long.toString(System.currentTimeMillis()/ 1000L)




注意: 数字 0123456789 实际上称为 "Arabic Numerals",但这个术语在这种情况下会造成混淆,因为阿拉伯语使用的实际数字是不同的(٠١٢٣٤٥٦٧٨٩)。