0

目前,我们正在使用StringEscapeUtils.escapeEcmaScript转义任何引号和制表符等,它适用于英文,但当涉及到日文时,它将所有日文字符编码为 un​​icode,需要有关如何在转义所有特殊字符(引号、制表符)的同时维护日文字符的建议ETC)。

例子:

System.out.println(StringEscapeUtils.escapeEcmaScript("Price must be between 1 and 3"));
System.out.println(StringEscapeUtils.escapeEcmaScript("で本を販売して 70% のロイヤリティを得るに"));
System.out.println(StringEscapeUtils.escapeEcmaScript("Der Preis muss zwischen angewendet werden kann."));

输出:

Price must be between 1 and 3
\u3067\u672C\u3092\u8CA9\u58F2\u3057\u3066 70% \u306E\u30ED\u30A4\u30E4\u30EA\u30C6\u30A3\u3092\u5F97\u308B\u306B
Der Preis muss zwischen angewendet werden kann.

看起来它只在日语中失败

4

1 回答 1

0

StringEscapeUtils.escapeEcmaScript总是转义U+0020-U+007F之外的字符。

如果您不想转义日文字符,则只需将字符串中的 ASCII 字符传递给StringEscapeUtils.escapeEcmaScript().

package org.example;

import java.util.Arrays;

import org.apache.commons.text.StringEscapeUtils;

public class Test {
  public static void main(String[] args) {
      System.out.println(escapeEcmaScript("Price must be between 1 and 3"));
      System.out.println(escapeEcmaScript("で本を販売して 70% のロイヤリティを得るに"));
      System.out.println(escapeEcmaScript("Der Preis muss zwischen angewendet werden kann."));
      System.out.println(escapeEcmaScript("1'2\"/3"));
  }

  public static String escapeEcmaScript(String str) {
      return Arrays.stream(str.split("")).map(s -> escapeCharacter(s)).collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();
  }

  public static String escapeCharacter(String str) {
      if (str.matches("\\p{ASCII}")) {
          return StringEscapeUtils.escapeEcmaScript(str);
      } else {
          return str;
      }
  }
}

你会得到这样的结果:

Price must be between 1 and 3
で本を販売して 70% のロイヤリティを得るに
Der Preis muss zwischen angewendet werden kann.
1\'2\"\/3
于 2021-05-21T16:45:47.967 回答