我有一个CSV文件,使用Excel将其另存为CSV UTF-8编码。 我的Java代码将文件读取为字节数组
然后
String result = new String(b, 0, b.length, "UTF-8");
但是当保存到数据库时,内容“蒙特利尔”变为“蒙特?al”,这可能是什么问题?
环境为unix,
-bash-4.1$ locale
LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=
顺便说一句,当我运行代码并在DB中看到正确的“蒙特利尔”时,它可以在Windows机器上运行。因此,我的猜测是该环境具有一些默认的语言环境设置,可以强制使用dedault编码。
谢谢
答案 0 :(得分:1)
我没有完整的代码,但是我尝试了以下代码,它对我有用:
String x = "c:/Book2.csv";
BufferedReader br = null;
try{
br = new BufferedReader(new InputStreamReader(new FileInputStream(
x), "UTF8"));
String b;
while ((b = br.readLine()) != null) {
System.out.println(b);
}
} finally {
if (br != null){
br.close();
}
}
如果您在控制台上看到“ Montr?al”字样,请不要担心。这并不意味着该程序无法运行。现在,您可能要检查控制台是否支持打印UTF-8字符。因此,您可以进行调试并检查变量,以检查是否具有所需的内容。
如果您在调试中看到正确的值,它会显示“?”在输出中,您可以放心String变量具有正确的值,并且可以根据需要将其写回到任何文件或DB。
如果看到“?”当查询数据库时,您可能使用的工具无法正确打印输出。尝试通过在代码中放入调试来读取Java代码中的DB值进行检查。我通常使用腻子查询数据库以正确查看双字节字符。这就是我所拥有的,希望对您有所帮助。
答案 1 :(得分:-2)
您必须使用ISO / IEC 8859,而不是UTF-8,如果您查看Wikipedia页面上的字符编码列表,就会了解其中的区别。 基本上,UTF-8是西方国家使用的commom编码...
此外,您可以检查终端编码,也许是问题所在。