当我尝试将时间戳作为邮寄请求的参数时,在阿拉伯电话等上,它似乎将其转换为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字符串。 最佳答案
Formatter
,String.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实际上被称为“阿拉伯数字”,但是由于阿拉伯语使用的实际数字不同(٠١٢٣٤٥٦٧٨٩),因此在此上下文中该术语会造成混淆。