性格问题
Character Issues
背景故事
我基本上是从数据库中检索字符串。我改变了一些文本或那些字符串。然后我将这些字符串上传回数据库,替换原来的字符串。查看显示这些字符串的前端后,我注意到了字符问题。我不再有原始字符串,但我有更新后的字符串。
问题
这些字符串中包含其他语言的字符。它们现在无法正确显示。我查看了代码点,原来的章程是一个代码点,现在是两个不同的代码点。
"Je?ro^me" //code-points 8. Code-points: 74, 101, 63, 114, 111, 94, 109, 101
"Jéróme" //code-points 6. Code-points: 74, 233, 114, 243, 109, 101
问题
如何让 "Je?ro^me"
回到 "Jéróme"
?
我尝试过的东西
- 使用 Notepad++ 将编码转换为
UTF8
、ANSI
和 WINDOWS-1252
。
- 创建了一个地图,用于查找
e?
之类的内容并将其转换为 é
。
问题与两次尝试解决问题
一个。尝试不同的转换后问题仍然存在。
b。这里有两个问题:
- 我不知道要寻找的所有潜在
e?
、o^
等。有超过 20,000 个文件,可能涵盖多种语言。
- 如果我的句子以
e?
结尾怎么办
为了更好地理解这个问题而进行的研究
- What is a "surrogate pair" in Java?
- https://docs.oracle.com/javase/tutorial/i18n/text/supplementaryChars.html
- https://www.w3.org/International/questions/qa-what-is-encoding
- https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
MCVE
import java.util.HashMap;
import java.util.Map;
/**
*
*https://docs.oracle.com/javase/tutorial/i18n/text/supplementaryChars.html
*https://www.w3.org/International/questions/qa-what-is-encoding
*https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
* @author sedri
*/
public class App {
static String outputString;
public static void main(String[] args) {
//May approach to fix the issue
//Use a map to replace string issue with the correct character
//The output looks good, but I would need to include all special characters for many languages.
//What if I have a sentence like: How old are thee?
Map<String, String> map = new HashMap();
map.put("e?", "é");
map.put("o^", "ó");
final String string = "Je?ro^me";
final String accentString = "Jéróme";
outputString = string;
map.forEach((t, u) -> {
if(outputString.contains(t))
{
outputString = outputString.replace(t, u);
}
});
System.out.println("Fixed output: " + outputString);
System.out.println("");
//End of my attempt at a solution.
System.out.println("code points: " + string.codePoints().count());
for(int i = 0; i < string.length(); i++)
{
System.out.println(string.charAt(i) + ": " + Character.codePointAt(string, i));
}
System.out.println("");
System.out.println("code points: " + accentString.codePoints().count());
for(int i = 0; i < accentString.length(); i++)
{
System.out.println(accentString.charAt(i) + ": " + Character.codePointAt(accentString, i));
}
System.out.println("");
System.out.println("code points: " + outputString.codePoints().count());
for(int i = 0; i < outputString.length(); i++)
{
System.out.println(outputString.charAt(i) + ": " + Character.codePointAt(outputString, i));
}
System.out.println("");
}
}
您的代码点之一是 63(问号)这一事实意味着您将无法可靠地将数据恢复为原始格式。 ?
可以表示许多未正确解码的不同字符,这意味着您已经丢失了恢复原始字符的重要信息。
您需要做的是建立正确的编码,以便在您首先从数据库中读取时使用。由于您没有在读取这些字符串的位置发布代码,因此我无法确切地告诉您如何或在何处执行此操作。
希望数据库中的数据本身没有被错误的字符编码破坏,否则您已经丢失了所需的信息。
您或许可以部分修复此类损坏,方法是将“o^”替换为“ó”,但如果同时使用“è”和“é” " 变成 "e?",你永远无法确定哪个是哪个。
背景故事
我基本上是从数据库中检索字符串。我改变了一些文本或那些字符串。然后我将这些字符串上传回数据库,替换原来的字符串。查看显示这些字符串的前端后,我注意到了字符问题。我不再有原始字符串,但我有更新后的字符串。
问题
这些字符串中包含其他语言的字符。它们现在无法正确显示。我查看了代码点,原来的章程是一个代码点,现在是两个不同的代码点。
"Je?ro^me" //code-points 8. Code-points: 74, 101, 63, 114, 111, 94, 109, 101
"Jéróme" //code-points 6. Code-points: 74, 233, 114, 243, 109, 101
问题
如何让 "Je?ro^me"
回到 "Jéróme"
?
我尝试过的东西
- 使用 Notepad++ 将编码转换为
UTF8
、ANSI
和WINDOWS-1252
。 - 创建了一个地图,用于查找
e?
之类的内容并将其转换为é
。
问题与两次尝试解决问题
一个。尝试不同的转换后问题仍然存在。
b。这里有两个问题:
- 我不知道要寻找的所有潜在
e?
、o^
等。有超过 20,000 个文件,可能涵盖多种语言。 - 如果我的句子以
e?
结尾怎么办
为了更好地理解这个问题而进行的研究
- What is a "surrogate pair" in Java?
- https://docs.oracle.com/javase/tutorial/i18n/text/supplementaryChars.html
- https://www.w3.org/International/questions/qa-what-is-encoding
- https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
MCVE
import java.util.HashMap;
import java.util.Map;
/**
*
*https://docs.oracle.com/javase/tutorial/i18n/text/supplementaryChars.html
*https://www.w3.org/International/questions/qa-what-is-encoding
*https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/
* @author sedri
*/
public class App {
static String outputString;
public static void main(String[] args) {
//May approach to fix the issue
//Use a map to replace string issue with the correct character
//The output looks good, but I would need to include all special characters for many languages.
//What if I have a sentence like: How old are thee?
Map<String, String> map = new HashMap();
map.put("e?", "é");
map.put("o^", "ó");
final String string = "Je?ro^me";
final String accentString = "Jéróme";
outputString = string;
map.forEach((t, u) -> {
if(outputString.contains(t))
{
outputString = outputString.replace(t, u);
}
});
System.out.println("Fixed output: " + outputString);
System.out.println("");
//End of my attempt at a solution.
System.out.println("code points: " + string.codePoints().count());
for(int i = 0; i < string.length(); i++)
{
System.out.println(string.charAt(i) + ": " + Character.codePointAt(string, i));
}
System.out.println("");
System.out.println("code points: " + accentString.codePoints().count());
for(int i = 0; i < accentString.length(); i++)
{
System.out.println(accentString.charAt(i) + ": " + Character.codePointAt(accentString, i));
}
System.out.println("");
System.out.println("code points: " + outputString.codePoints().count());
for(int i = 0; i < outputString.length(); i++)
{
System.out.println(outputString.charAt(i) + ": " + Character.codePointAt(outputString, i));
}
System.out.println("");
}
}
您的代码点之一是 63(问号)这一事实意味着您将无法可靠地将数据恢复为原始格式。 ?
可以表示许多未正确解码的不同字符,这意味着您已经丢失了恢复原始字符的重要信息。
您需要做的是建立正确的编码,以便在您首先从数据库中读取时使用。由于您没有在读取这些字符串的位置发布代码,因此我无法确切地告诉您如何或在何处执行此操作。
希望数据库中的数据本身没有被错误的字符编码破坏,否则您已经丢失了所需的信息。
您或许可以部分修复此类损坏,方法是将“o^”替换为“ó”,但如果同时使用“è”和“é” " 变成 "e?",你永远无法确定哪个是哪个。