1

我正在 Windows 上使用 Java 和 PostgreSQL。我有一些单词包括土耳其语字符,如 İ、ş、ö、ç 等。

在 Java 中,我将单词分配给字符串并尝试将其写入数据库。当我在 java 上打印它时,它的编码显示正确并且所有字符都正确显示。但是,在将其写入数据库时​​,文本似乎被破坏/打乱了。

我用这个命令创建了我的数据库:

CREATE DATABASE dbname ENCODING "UTF-8"

我试图通过将土耳其字符转换为 ISO-8859-1 编码来修复它,例如 (İ -> \u0130 , ş -> \u015F)

//\u0130leti\u015Fim = İletişim
title = \u0130leti\u015Fim
String mytitle = new String(title.getBytes("ISO-8859-1"), "UTF-8");

然后我尝试写入mytitle数据库,但没有成功。

谢谢你的建议。

已解决:我意识到它可以将土耳其语字符写入数据库,但问题出在响应上。我在写回复之前添加了这些行。

String contentType= "text/html;charset=UTF-8";   
response.setContentType(contentType);
response.setCharacterEncoding("utf-8");

添加后,它现在可以工作了。我希望,我能解释清楚。

4

3 回答 3

3

When you call title.getBytes("ISO-8859-1"), you're promising the Java runtime that the characters in the string can be represented as ISO-8859-1 bytes, which is not actually true for either \u0130 or \u015f. Therefore already the conversion to bytes will do something unspecified with your Turkish characters -- probably they will just be dropped.

Next, attempting to interpret whichever bytes you get out of it as UTF-8 even though they're really ISO-8859-1 is then guaranteed to make a complete mess of everything that wasn't ASCII to begin with.

(The repretoire of ISO-8859-1 happens to coincide exactly with the Unicode characters that can be written as \u00XX for some XX).

于 2012-09-18T18:21:20.910 回答
2

对于编码问题,您需要检查几件事:

  • 您的源文件是否采用您期望的编码。
  • 如何client_encoding设置
  • 数据库编码是什么

在 Java 的情况下,PgJDBC 要求client_encoding始终存在UTF-8,并且如果您将其设置为其他内容,它将阻塞,因此这不会成为问题。您已经证明您的数据库也是UTF-8如此。因此,您的 Java 源代码似乎与 Java 编译器和运行时所期望的编码不同。

默认情况下javac,将在平台默认编码中解释您的源代码。如果你以不同的编码保存你的源代码,就会发生奇怪的事情。保存您的来源:

  • 在您的 Windows 平台的默认编码中;
  • 作为 Unicode(“UTF-16”或“UCS-2”);或者
  • 作为带有字节顺序标记 (BOM)的 UTF-8 。许多程序不会为 UTF-8 添加 BOM。

然后重新编译你的程序。如果这没有帮助,您需要跟进更多细节,从“它不起作用”的确切SELECT含义开始,输出使用 Java 插入的数据psql等。

于 2012-09-19T00:10:57.647 回答
0

您应该像这样创建数据库:

CREATE DATABASE <db name> 
        WITH OWNER <owner user name>
    TEMPLATE template0 
    ENCODING 'UTF-8' 
    LC_COLLATE 'tr_TR.UTF-8' 
    LC_CTYPE = 'tr_TR.UTF-8';
于 2021-07-15T16:08:54.977 回答