俄语字符在java中显示不好,但在php中还可以



我们有一个Web应用程序,可以在其中插入俄语字符,并且在mysql db中看起来像这样 Ð"Ð3/4ÑÑ'авка груза.但是当在网络上查看时,会以俄语字符形式正确显示。但是当我们在 Java 应用程序中执行此操作时,它会以这种格式显示 Ð"Ð3/4Ññ'авка груза?有什么帮助吗?

部分Java代码如下。

Statement stmt1 = null;
//System.out.println("nnSELECT selectOTACommand : "+selectOTACommand);
String select1 = "Select locName from tblLoc where locID=2280"
ResultSet rs1= stmt1.executeQuery(select1);
while(rs1.next()) 
{
System.out.println("Loc Name : "+rs1.getString("locName"));
}      
try{
if ( rs1 != null ){
rs1.close();
}
else{
System.out.println("MyError:rs1 is null in finally close");
}
if ( stmt1 != null ){
stmt1.close();
}
else{
System.out.println("MyError:stmt1 is null in finally close");
}
}
catch(SQLException ex){
System.out.println("MyError:SQLException has been caught for stmt1 close");
ex.printStackTrace(System.out);
}  

您必须在三个地方设置使用的编码,以便它正常并且应该如此。

  1. .php
  2. MySQL 数据库和表
  3. PHP
  4. 用于与 MySQL 通信的链接(这是大多数 PPL 错过的) 你在这里有两个选择。 PHP 的mysql_set_charset()-> mysql_set_charset 或者使用两个查询来执行此操作SET NAMES 'charset_name'+SET CHARACTER SET charset_name

该应用程序说它是Windows-1251编码。 您可能应该将其转换为 UTF。

我建议,正如尼古拉上面所说,设置名称"utf8"可以解决你的问题。您必须说MySQL客户端将使用哪种字符集编码来发送SQL语句,以及它希望以哪种字符集编码接收结果。"集名称"会影响所有这些设置。

请先阅读 每个软件开发人员绝对、肯定必须了解的 Unicode 和字符集的绝对最小值(没有任何借口!

之后,让我们看一下您的 php 脚本以及它如何与其他涉及的组件交互。

您的 PHP 脚本接收来自客户端/浏览器的输入,该输入显然是 utf-8 编码的。 即,如果客户端发送字符 Д,它将两个字节0xD0和0x94发送。
如果您采用这两个字节并将它们解释/显示为例如.iso-8859-1编码,您将获得两个字符:Ð"(就像在问题文本中一样)。
您的PHP脚本获取这两个字节并将它们传递给MySQL。MySQL现在也必须解析/解释这些字节。这涉及相当多的编码/字符集相关设置,但让我们将其简化为:有一个与 php 和 mysql 之间的连接相关联的字符集,还有一个用于将数据存储在 MySQL 服务器中的字符集。(有关更多信息,请阅读 https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html)。
看起来您案例中的连接字符集类似于 iso-8859-1。 即MySQL服务器将0xD0,0x94解释为Д而不是Д- 两个字符。
当您的 php 脚本从 MySQL 服务器获取数据时,服务器会发送两个字符,Ð。由于连接字符集php<->mysql仍然是iso-8859-1,MySQL服务器将这两个字符再次编码为0xD0和0x94。
PHP 获取这两个字节(不知道 utf-8,但在这种情况下这无关紧要)并将其发送回客户端。
客户端现在必须解释这两个字节。在您的情况下("何时在 Web 上查看"),客户端很可能从 http 响应中的标头或 html 文档中的等效参数获取有关编码的信息。而这个参数似乎是"流是utf-8"编码的。因此,两个字节 0xD0,0x94 再次显示为Д。所以从客户端/网络浏览器的角度来看,一切都很好,php 不关心错误,在这种情况下 MySQL 也不关心。(有些问题可能会出现在"你的php脚本和"在"MySQL服务器中......

所以,这里的一切看起来都很好 - 但是...这主要是因为PHP不在乎。另一方面,Java通常这样做。
即,当MySQL服务器将两个"字符"Ð时,它们将在java应用程序中作为两个单独的字符进行处理。当这两个字符被发送到客户端时,客户端将被编码,客户端也会将它们解释为两个单独的字符,依此类推。(至少通常默认情况下会有更多的自动处理。
与您用来查看 MySQl 数据库的前端相同。它显然正确处理了编码,因此显示До‚авка груза而不是Дотавка груза


  • 确保数据库/表列编码可以处理必须存储的字符;utf-8 可以做到这一点 https://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html。
  • 确保您的 php 脚本将连接编码设置为 utf-8,因为无论如何,脚本似乎都会从客户端接收到,无需先将其转换为另一个字符集。如何做到这一点取决于您用于连接到MySQL服务器的API:

MySQL(mysql_connect):此模块已弃用,请考虑使用另一个模块,如MySQLI或PDO。设置连接字符集的正确方法是

mysql_set_charset('utf-8', $mysql);

该函数是 php>=5.2.3,但任何其他方法(如SET NAMES)都会使客户端库对连接字符集一无所知,因此例如 mysql_real_escape() 可能无法正常工作。 见 http://docs.php.net/mysql_set_charset

mysqli ( new MySQLi(), mysqli_connect ) : 见 http://docs.php.net/mysqli.set-charset.php

pdo ( new PDO('mysql:...') ):

$pdo = new PDO('mysql:host=HOSTNAME;port=3306;dbname=DATABASENAME;charset=utf8');

PHP>= 5.3.6,请参阅 http://docs.php.net/ref.pdo-mysql.connection

最新更新