当我尝试将时间戳作为邮寄请求的参数时,在阿拉伯电话等上,它似乎将其转换为unicode而不是很长的代码。谁能解释我背后的任何理论。

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

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字符串。

最佳答案

FormatterString.format()PrintWriter.format()使用的PrintWriter.printf()类是对语言环境敏感的。

这意味着,如果不给它一个明确的语言环境,它将根据默认语言环境格式化数字。

在语言环境语言为阿拉伯语的情况下,取决于所使用的语言环境提供商,数字格式可能会使用“纯阿拉伯语”数字。

例如,使用以下代码片段:

    int i = 1234567890;

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


当语言环境提供程序为默认语言环境提供程序(“ JRE”)时,它将显示:

1234567890
1234567890

But if I run it with extended locale providers, like so:

java -Djava.locale.providers=CLDR SimpleTest

The output I get is:

1234567890
١٢٣٤٥٦٧٨٩٠

What you are seeing in your post parameter is the UTF-8 representation of these pure Arabic digits.

A simple solution would be to use an explicit locale. Instead of using

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实际上被称为“阿拉伯数字”,但是由于阿拉伯语使用的实际数字不同(٠١٢٣٤٥٦٧٨٩),因此在此上下文中该术语会造成混淆。

10-07 18:54