首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Java规范化器将Unicode中预先构建的字符串转换为英文读文本

如何使用Java规范化器将Unicode中预先构建的字符串转换为英文读文本
EN

Stack Overflow用户
提问于 2022-11-21 20:12:48
回答 2查看 43关注 0票数 1

我试图用Java来读取一个文件,扫描Unicode作为一个转义序列,转换成英文可读的,然后把替换写到文件上。举个例子,我制作了一个类似的脚本。如果输入是字符串,则规范化器可以工作,但如果我通过数组或从stringBuilder构建字符串,则输出实际上就是没有任何规范化的字符串。我如何使用stringBuilder来使用Java的规范化器?

例:

代码语言:javascript
运行
复制
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.text.Normalizer;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {
  
  String broke = "";
  String[] testArr = {"\\","u","0","0","e","0"};
  for(int i = 0; i < 6; i++) {
    broke+=testArr[i];
  }

    
    String works = "\u00e0";
    
      System.out.println("broke: " + broke);
        System.out.println("works: " + works);
    
    String temp = Normalizer.normalize(works, Normalizer.Form.NFD);
        System.out.println("temp:" + temp);
    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
    String fixedUnicode = pattern.matcher(temp).replaceAll("");
    System.out.println("fixedUnicode: " + fixedUnicode);
                    
  }
}

我注意到Java自动将syso中的(String = "\u00e0“)转换为适当的unicode,但是使用syso时,一个类似于”\u00e0“但使用stringBuilder或数组构建的字符串显示("\u00e0")。

EN

回答 2

Stack Overflow用户

发布于 2022-11-21 23:21:27

正如Bourque所说,规范器与Java转义无关。不要试图用它来做这件事;它根本不能做你想做的事情。

首先,让我们澄清一些事情。写这篇文章:

代码语言:javascript
运行
复制
String s = "\u00e0";

与编写以下内容的完全相同:

代码语言:javascript
运行
复制
String s = "à";

编译器(而不是Java运行时)将解释任何\u转义序列,就好像它是实际的代码点一样。无论使用哪种方法写入字符串值,字符串中都不存在\u。完全没有。

但是,如果由于某种原因,您的输入错误地添加了一个文字反斜杠字符,后面跟着一个u,后面跟着四个十六进制数字:

代码语言:javascript
运行
复制
// This is NOT a Unicode escape.  It is a six-character string.
String s = "\\u00e0";

您可以使用正则表达式匹配器替换每个这样的序列。

代码语言:javascript
运行
复制
Matcher hexMatcher = Pattern.compile("\\\\u(\\p{XDigit}{4})").matcher(s);
String fixed = hexMatcher.replaceAll(
    r -> String.format("%c", Integer.valueOf(r.group(1), 16)));
票数 0
EN

Stack Overflow用户

发布于 2022-11-25 20:58:30

在VGR的面包屑之后,我找到了这个。在生产过程中,我从JSON文件中读取字符串,将"\u####“的每个实例转换为英文字母。我们使用的自动软件,包括Unicode转义字符或重音字母。我逐行扫描文档,如果找到"\u“,将创建一个新字符串,其中包含以下四个字符,创建一个十六进制数字。

例:

代码语言:javascript
运行
复制
String hex = "####";
int decimal = Integer.parseInt(hex,16);
char myChar = (char) decimal;
String charConvert = myChar + "";

String tempie = Normalizer.normalize(charConvert, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
String fixedUnicode = pattern.matcher(tempie).replaceAll("");

然后,我将删除行中的索引,其中包含通过index+6找到的"\u“的索引值,然后插入fixedUnicode字符串walah。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74524402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档