Java 写入数据库时的土耳其语字符(postgresql)
我正在Windows上使用Java和PostgreSQL。我有一些单词包括土耳其语字符,如İ、ş、ö、ç等 在Java中,我将单词分配给字符串,并尝试将其写入数据库。当我在java上打印它时,它的编码显示正确,所有字符显示正确。然而,在将其写入数据库时,文本似乎被弄乱了 我使用以下命令创建了数据库:Java 写入数据库时的土耳其语字符(postgresql),java,postgresql,utf-8,character-encoding,turkish,Java,Postgresql,Utf 8,Character Encoding,Turkish,我正在Windows上使用Java和PostgreSQL。我有一些单词包括土耳其语字符,如İ、ş、ö、ç等 在Java中,我将单词分配给字符串,并尝试将其写入数据库。当我在java上打印它时,它的编码显示正确,所有字符显示正确。然而,在将其写入数据库时,文本似乎被弄乱了 我使用以下命令创建了数据库: CREATE DATABASE dbname ENCODING "UTF-8" 我试图通过将土耳其语字符转换为ISO-8859-1编码来修复它,如(İ->\u0130,ş->\u015F) 然后我
CREATE DATABASE dbname ENCODING "UTF-8"
我试图通过将土耳其语字符转换为ISO-8859-1编码来修复它,如(İ->\u0130,ş->\u015F)
然后我尝试将mytitle
写入数据库,但没有成功
谢谢你的建议
解决:我意识到它可以将土耳其语字符写入数据库,但问题出在响应上。我在写回复之前添加了这些行
String contentType= "text/html;charset=UTF-8";
response.setContentType(contentType);
response.setCharacterEncoding("utf-8");
添加此项后,它现在可以工作了。我希望,我可以清楚地解释。当您调用
title.getBytes(“ISO-8859-1”)
时,您向Java运行时承诺字符串中的字符可以表示为ISO-8859-1字节,这对于\u0130或\u015f都不是真的。
因此,到字节的转换将对土耳其语字符执行一些未指定的操作——可能它们将被删除
接下来,尝试将从中得到的任何字节解释为UTF-8,即使它们实际上是ISO-8859-1,也会保证将所有原本不是ASCII的内容都弄得一团糟
(ISO-8859-1的复述恰好与某些XX可以写为\u00XX的Unicode字符完全一致)。当您调用
title.getBytes(“ISO-8859-1”)
时,您向Java运行时承诺字符串中的字符可以表示为ISO-8859-1字节,这对于\u0130或\u015f实际上都不是真的。
因此,到字节的转换将对土耳其语字符执行一些未指定的操作——可能它们将被删除
接下来,尝试将从中得到的任何字节解释为UTF-8,即使它们实际上是ISO-8859-1,也会保证将所有原本不是ASCII的内容都弄得一团糟
(ISO-8859-1的repretoire恰好与某些XX可以写为\u00XX的Unicode字符完全一致)。关于编码问题,您需要检查以下几点:
- 无论源文件是否采用您期望的编码方式李>
- 如何设置客户机编码
- 数据库编码是什么
client_encoding
始终为UTF-8
,如果您将其设置为其他内容,则会阻塞,因此这不是问题所在。您已经展示了您的数据库也是UTF-8
。因此,您的Java源代码可能与Java编译器和运行时期望的编码不同
默认情况下。如果您以不同的编码保存了源代码,就会发生奇怪的事情。保存您的源:
- 在Windows平台的默认编码中李>
- 作为Unicode(“UTF-16”或“UCS-2”);或
- 与带字节顺序标记(BOM)的UTF-8相同。许多程序不为UTF-8添加BOM
然后重新编译你的程序。如果这没有帮助,您需要进一步了解更多细节,从“它不起作用”的确切含义开始,
SELECT
的输出使用psql
插入Java的数据,等等。关于编码问题,您有几件事要检查:
- 无论源文件是否采用您期望的编码方式李>
- 如何设置客户机编码
- 数据库编码是什么
client_encoding
始终为UTF-8
,如果您将其设置为其他内容,则会阻塞,因此这不是问题所在。您已经展示了您的数据库也是UTF-8
。因此,您的Java源代码可能与Java编译器和运行时期望的编码不同
默认情况下。如果您以不同的编码保存了源代码,就会发生奇怪的事情。保存您的源:
- 在Windows平台的默认编码中李>
- 作为Unicode(“UTF-16”或“UCS-2”);或
- 与带字节顺序标记(BOM)的UTF-8相同。许多程序不为UTF-8添加BOM
然后重新编译你的程序。如果这没有帮助,您需要进一步了解更多细节,从“它不起作用”的确切含义开始,
SELECT
的输出使用psql
插入Java的数据,等等。您的Java源文件是否保存为UTF-8?此外,ISO-8859-1不是像İ
->\u0130
,ş
->\u015F
。它们保存为UTF-8。连接是什么?您的Java源文件是否保存为UTF-8?此外,ISO-8859-1不是像İ
->\u0130
,ş
->\u015F
。它们被保存为UTF-8。连接是什么?当我将其保存在UTF-16或UCS-2中时,它会给出错误。我也尝试用UTF-8保存它,但是没有任何变化,它仍然不能写入数据库土耳其字符。此外,我还在Ubuntu上试过,但没有改变。@sinan“它会出错”。到底是什么错误?更新您的问题。当我将其保存在UTF-16或UCS-2中时,它会给出错误。我也试着用UTF-8和BOM表来保存它,但没有改变,它仍然不能写入数据库中的土耳其字符。此外,我还在Ubuntu上试过,但没有改变。@sinan“它会出错”。到底是什么错误?更新您的问题。我将代码更改为:title=“İletişim”;mytitle=新字符串(title.getBytes(),“UTF-8”);我也在ubuntu上试过,但它仍然不能正确地将土耳其语字符写入数据库。但你们到底在尝试什么呢
String contentType= "text/html;charset=UTF-8";
response.setContentType(contentType);
response.setCharacterEncoding("utf-8");