Имейте значение, которое поступает из внешнего источника данных REST/JSON в качестве специального символа. Я конвертирую его с помощью существующей утилиты CharDecoder.java, она остается прежней, но после ее вставки в базу данных MySQL (которая по умолчанию кодируется UTF-8) она превращается из ć в?.
Поток моей программы таков:
Внешний источник данных отправляет JSON → CharDecoder (внутри военного файла в tomcat7, обрабатывает специальные символы), затем заполняет строку → внутри базы данных MySQL.
Конечным результатом в базе данных MySQL является недопустимый символ.
Информация об окружающей среде Dev:
Я использую Java 1.7.
Maven 3.3.3, внутри моего тега pom.xml <properties>
:
<project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding>
Eclipse Oxygen на MacOS.
Я запускаю Eclipse Oxygen на macOS - внутри представления свойств проекта (щелкните по проекту и ⌘I также известен как COMMAND + I), он заявляет, что кодировка текстового файла - UTF-8.
Когда я конвертирую его с помощью служебного класса, который работает в базе кода, он работает, но при обновлении строки в базе данных MySQL (которая по умолчанию используется в кодировке UTF-8) она становится недопустимым символом.
Итак, я добавил этого персонажа в свой массив символов: "ć" (его расположение в той же строке, которая начинается с "î").
public class CharDecoder {
public final static String chars [] =
{
"ö", "ä", "ü", "Ö", "Ä", "Ü", "ß",
"?", "\\", ",", ":", ";", "#", "+", "~", "!", "\"", "§", "$", "%",
"&", "(", ")", "=", "<", ">", "{", "[", "]", "}", "/", "â", "ê",
"î", "ô", "û", "Â", "Ê", "Î", "Ô", "Û", "á","ć", "é", "í", "ó", "ú",
"Á", "É", "Í", "Ó", "Ú", "à", "è", "ì", "ò", "ó", "ù", "Á", "É", "Í",
"Ó", "Ú", "°", "³", "²", "€", "|", "^", "'", "´", "'", " ", "@",
"~", "*"
};
public final static String charsHtml[] =
{
"ö", "ä", "ü", "Ö", "Ä", "Ü",
"ß", "?", "\\", ",", ":", ";", "#", "+", "˜", "!", "\"",
"§", "$", "%", "&", "(", ")", "=", "<", ">", "{",
"[", "]", "}", "/", "â", "ê", "î", "ô",
"û", "Â", "Ê", "Î", "Ô", "Û",
"á", "é", "í", "ó", "ú",
"Á", "É", "Í", "Ó", "Ú",
"à", "è", "ì", "ò", "Ù",
"À", "È", "Ì", "Ò", "Ù",
"°", "³", "²", "€", "|", "ˆ", "'",
"´", "'", " ", "@", "~", "*"
};
public final static String entities[] = {
"F6", "E4", "FC", "D6", "C4",
"DC", "DF", "3F", "5C", "2C", "3A", "3B", "23", "2B", "7E", "21",
"22", "A7", "24", "25", "26", "28", "29", "3D", "3C", "3E", "7B",
"5B", "5D", "7D", "2F", "E2", "EA", "EE", "F4", "FB", "C2", "CA",
"CE", "D4", "DB", "E1", "E9", "ED", "F3", "FA", "C1", "C9", "CD",
"D3", "DA", "E0", "E8", "EC", "F2", "F9", "C1", "C9", "CD", "D3",
"DA", "B0", "B3", "B2", "80", "7C", "5E", "60", "B4", "27", "20",
"40", "98", "2A"
};
public static String inputToChar(String input) {
return (inputTo(input, chars));
}
public static String inputTo(String input, String[] tc) {
StringBuilder sb = new StringBuilder();
boolean entity = false;
input = input.replace ('+', ' ');
String tokens = tc == charsHtml ? "%<>" : "%";
for (StringTokenizer st = new StringTokenizer (input, tokens, true); st.hasMoreTokens(); ) {
String token = st.nextToken();
if (entity) {
boolean replaced = false;
for (int i = 0; i < entities.length; i++) {
if (token.startsWith (entities[i])) {
sb.append (tc[i]);
sb.append (token.substring (2));
replaced = true;
break;
}
}
if (!replaced) {
sb.append (token);
}
entity = false;
}
else if (token.equals ("%")) {
entity = true;
continue;
}
else if (token.equals ("<")) {
sb.append ("<");
}
else if (token.equals (">")) {
sb.append (">");
}
else {
sb.append (token);
}
}
return (sb.toString ());
}
public static void main(String [] args) {
String person1 = CharDecoder.inputToChar("Lukić");
System.out.println(person1);
}
}
Чтобы сделать этот вопрос более простым, я удалил код JDBC (простой запрос на обновление JDBC) только что создал метод main(). Когда я запускаю этот метод main(), выход:
Lukić
Это прекрасно и что я хочу. Однако, когда я обновляю его с помощью Spring JDBC, в базе данных MySQL (которая по умолчанию используется в кодировке UTF-8), она становится:
Luki?
Это определенно происходит со стороны базы данных, должен ли я изменить его (таблица символов по умолчанию для LATIN1)?
Должен ли я изменить всю кодировку базы данных по умолчанию на LATIN1? Я просто бросаю идеи...
Есть ли способ исправить это, не изменяя кодировку по умолчанию (не хотите повреждать любые существующие данные)...
useUnicode = да и characterEncoding = UTF-8
поместите это в свой URL базы данных
?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8
- Спасибо, ваше предложение помогло мне найти решение.
Если вы хотите иметь полнофункциональную поддержку Unicode, вы также можете пройти весь путь:
character_set_server=utf8mb4
См.: Какая разница между кодировками utf8mb4 и utf8 в mysql?
entityTo
? И у вас есть опечатка в основном определенииpublic static main void
должно бытьpublic static void main
CharDecoder.inputToChar("Lukić");
и это работает нормально здесь. Я подозреваю, что настройки вашего проекта не настроены как UTF-8 (если вы находитесь в Eclipse, выберите класс или проект и нажмите CTRL + ENTER)