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",但这个术语在这种情况下会造成混淆,因为阿拉伯语使用的实际数字是不同的(٠١٢٣٤٥٦٧٨٩)。
虽然我试图将时间戳作为参数传递给 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'
.
只需使用 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",但这个术语在这种情况下会造成混淆,因为阿拉伯语使用的实际数字是不同的(٠١٢٣٤٥٦٧٨٩)。