Java 在unix计算机上呈现US单元分隔符

Java 在unix计算机上呈现US单元分隔符,java,bash,unix,ascii,Java,Bash,Unix,Ascii,我有一个java应用程序,它在unix机器上提供一个文件,每个字符串包含多个US单位分隔符, 在本地,当我在windows计算机上的eclipse上运行它时,它在控制台上显示良好: 1▼somedata▼somedata▼0▼635064▼0▼somedata▼6 但是当我在unix机器上运行程序时,文件的内容显示为 1â¼N/Aâ¼somedataoâ¼somedataâ¼somedata 将LANG变量更改为区域设置-a中的任何值似乎不起作用。看起来字符集不匹配。在linux上,您很可能

我有一个java应用程序,它在unix机器上提供一个文件,每个字符串包含多个US单位分隔符, 在本地,当我在windows计算机上的eclipse上运行它时,它在控制台上显示良好:

1▼somedata▼somedata▼0▼635064▼0▼somedata▼6
但是当我在unix机器上运行程序时,文件的内容显示为

1â¼N/Aâ¼somedataoâ¼somedataâ¼somedata

将LANG变量更改为
区域设置-a中的任何值似乎不起作用。

看起来字符集不匹配。在linux上,您很可能有UTF-8。使用Java时,通常会得到UTF-16。尝试使用
iconv
从UTF16转换为UTF8,看看它在linux上是什么样子

cat file | iconv -f UTF-16 -t UTF-8
但事实上,如果是UTF-16,情况会更糟。可能只是字体不匹配。但如果这是问题所在,您可以使用字符编码(请参阅源代码并转换为utf-8)。或者您的源代码是UTF-8,目标代码是一些本地编码。
这是有意义的,因为您的特殊字符在UNIX计算机中显示为2个字符。这意味着源代码很可能是UTF-8,UNIX使用的编码中每个字节都是单个字符。

如何“更改LANG变量”?US是一个控制字符。没有为其定义可视化表示。@chrylis
export LANG=value
您确定终端程序本身设置正确吗?例如,Konsole在视图菜单上有一个编码选项。黑色三角形是
U+25BC
,黑色下指三角形。它的UTF-8表示法是E296 BC。将每个字节视为ISO 8859(您的终端显然使用的字符集),
E2
96
是未定义的(并且似乎未打印),而
BC
¼
。换句话说,您的代码使用的是一个特定的Unicode字符(不是ASCII 0x1f,单位分隔符),它是按照您的语言环境以UTF-8编写的,但是您的终端显示的是逐字节的,而不是理解UTF-8。您好,我试过了,但结果完全相同,正如您所说,在我的linux机器上,我有UTF-8`echo${LANG}en_US.UTF-8`@JBoy,这并不意味着你的终端是UTF-8<代码>语言
只告诉程序预期的输出。您可以进行一个简单的测试,并在终端上抛出一些多字节UTF-8字符,以查看它们是如何显示的
iconv
很好,因为它实际上改变了字节流的字符集,所以您需要将
iconv
匹配到您终端期望的编码。更改
LANG
不会以任何方式影响正在运行的终端。