微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

角色问题

如何解决角色问题

背景故事

我基本上是从数据库中检索字符串。我更改一些文本或那些字符串。然后,我将那些字符串替换为原始字符串,上传数据库。看完显示这些字符串的前端后,我对字符问题感到警觉。我不再拥有原始字符串,但拥有更新后的字符串。

问题

这些字符串中包含其他语言的字符。它们现在无法正确显示。我查看了代码点,看来原来的宪章是一个代码点,现在变成了两个不同的代码点。

"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,243,101 

问题

如何将"Je?ro^me"返回到"Jéróme"

我尝试过的事情

  1. 使用记事本++来更改与UTF8ANSIWINDOWS-1252间的编码转换。
  2. 创建了一个地图,查找诸如e?之类的东西并将其转换为é

有两次尝试解决问题的问题

a。尝试进行不同的转换后,该问题仍然存在。

b。这里有两个问题:

  1. 我不知道要寻找的所有潜在e?o^等。超过20,000个文件可能涵盖多种语言。
  2. 如果我的句子结尾为e?
  3. ,该怎么办?

为了更好地理解此问题我进行了研究

  1. What is a "surrogate pair" in Java?
  2. https://docs.oracle.com/javase/tutorial/i18n/text/supplementaryChars.html
  3. https://www.w3.org/International/questions/qa-what-is-encoding
  4. 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://stackoverflow.com/questions/5903008/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/
 * @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 correct character
        //The output looks good but I would need to include all special characters for may 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”吗?”,则无法确定是哪一个。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?