我有一个屏幕,用户可以在其中查看英语单词并输入任何语言的等效翻译。
我的数据库创建查询:
CREATE DATABASE IF NOT EXISTS lang_db
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
我的表创建查询:
CREATE TABLE lang_map (
WORD VARCHAR(2048) NULL,
DESCRIPTION VARCHAR(2048) NULL
) CHARACTER SET utf8 COLLATE utf8_general_ci;
我在json中获取了单词和描述,我在java中读取然后触发查询以插入到表中。但对于像中文或俄文这样的语言,只插入了?
的内容。
Mysql版本:5.5 Java:1.6
更新: Java代码:
控制器处理ajax调用。
@ResponseBody
public setChanges(@RequestBody JSONObject keyValueMap) throws Exception {
return myService.setChanges(keyValueMap);
}
服务代码
List<LangMapping> langMappings = new ArrayList<LangMapping>();
for(Object keyObject : changedKeyValueMap.keySet()){
String key = String.valueOf(keyObject) ;
String description = (String) changedKeyValueMap.get(key);
langMappings.add(buildLangMapping(key,localeCode,description)); //pojo
}
//using above array list i am inserting into database table
答案 0 :(得分:0)
您必须确保在应用程序的每个阶段使用正确的编码。最简单的方法通常是在所有情况下使用相同的编码,在您的情况下使用UTF-8。
要调试您的问题,您可以按照以下步骤操作:
使用像Notepad ++这样的优秀文本编辑器,打开一些你得到的JSON文件,检查它们是否被正确编码(即俄文/中文/任何字符是否正确显示),并检查编辑器是否有自动检测到JSON文件的编码为UTF-8。
如果您没有将源JSON数据作为文件,但将其作为对某些Web请求的响应,请尝试使用wget
或curl
等工具将其转储到文件中,像上面描述的那样检查该文件。
在使用JAVA读取JSON输入后,在进一步处理之前从JAVA中转储输入。我不了解JAVA,但这是一个普遍的问题,你必须告诉你的编程语言/图书馆/文件打开函数输入是如何编码的。
如果你不这样做这样做,JAVA可能会假设JSON输入是一些默认编码;如果出错,读入的数据将是垃圾。
同样,在转出你读过的内容之前,告诉JAVA应该如何编码输出。如果转出到控制台,请确保控制台也使用您期望的编码。
请注意,对于使用CGI机制的Web应用程序也是如此(几乎所有人都这样做)。在此上下文中,标准输入和标准输出可视为普通文件。
当然,如果JAVA的文件和标准I / O的默认编码已经是UTF-8,您可以省略这一步。
如果您还没有发现问题,请告诉您的数据库驱动程序您正在发送UTF8编码数据,并且您希望获得UTF-8编码数据。由于我不使用JAVA,我不知道如何做到这一点,但我确信它在文档中有描述。
如果它仍然不起作用,告诉MySQL连接和客户端使用UTF-8(只要你的驱动程序在执行第3步后没有自动执行)。使用SET SESSION character_set_x = 'utf8'
之类的语句,其中x
分别代表client
,results
或connection
。连接到数据库后,每次都必须立即执行此操作(当然,只有在连接时,驱动程序不会自动执行此操作,具体取决于其运行时或静态配置)。
如果您按照这些步骤操作,您将有望找到问题所在。让我们知道它是怎么回事。
答案 1 :(得分:0)
UTF不保存俄语,中文,德语等其他语言的所有字符。 您可以参考Differences between utf8 and latin1