【问题标题】:How to build the longest String with different Unicode characters如何使用不同的 Unicode 字符构建最长的字符串
【发布时间】:2013-10-18 16:04:23
【问题描述】:

提前感谢您的耐心等待。这是我的问题。 我正在用 Java 编写一个程序,该程序最适合使用大量不同的字符。 我必须将所有字符存储在一个字符串中。我从 私有静态最终字符串值=“0123456789”; 然后我添加了 A-Z、a-z 和所有公共符号。 但它们仍然太少,所以我认为 Unicode 可能是解决方案。

现在的问题是:获取可以在 Eclipse 中显示的所有 unicode 字符的最佳方法是什么(如果存在无法识别的字符,我的算法可能会失败 - 那些显示为小矩形的字符)。是否可以构建一个字符串(或一些字符串),并正确显示此处存在的所有字符(en.wikipedia.org/wiki/List_of_Unicode_characters)?

我可以从http://www.terena.org/activities/multiling/euroml/tests/test-ucspages1ucs.htmlhttp://zenoplex.jp/tools/unicoderange_generator.html 进行粗略的复制粘贴,但我希望有一些更清洁的解决方案。 我不知道是否有一种方法可以从字体(Unifont 字体)中提取字符。或者也许我应该解析这个(www.utf8-chartable.de/unicode-utf8-table.pl)网页。

此外,通过将所有字符添加到字符串中,我可能会收到错误: “该类型生成一个需要超过 65535 个字节才能在常量池中以 Utf8 格式编码的字符串”(在此问题中讨论 SO:/questions/10798769/how-to-process-a-string-with-823237-characters )。

可以接受混合解决方案。我可以在 SO questions/4989091/removing-duplicates-from-a-string-in-java 上的这个问题之后删除重复项)

最后:每个获得最长唯一不同字符字符串的解决方案都被接受。 谢谢!

【问题讨论】:

  • "那些像小矩形一样显示的" - 取决于字体或文件格式。一些符号需要特定的字体,而另一些则需要文件格式。
  • 我正在尝试一个大的基础转换。

标签: java string unicode


【解决方案1】:

你把一些事情搞混了。一个字符能否在Eclipse中显示的问题取决于你选择的字体;以及能否正确处理源文件取决于您为源文件设置的字符编码。选择 UTF-8和一个好的Unicode字体时,您可以使用和显示几乎所有字符,至少比单个 String literal。

但是在 Eclipse 中显示角色真的需要吗?您可以使用 unicode 转义,例如\u20ac 指的是字符,不管它们是否可以显示或者文件编码是否可以处理它们。

如果不需要炸毁你的源代码,很容易创建一个包含所有现有字符的String

// all chars (i.e. UTF-16 values)
StringBuilder sb=new StringBuilder(Character.MAX_VALUE);
for(char c=0; c<Character.MAX_VALUE; c++) sb.append(c);
String s=sb.toString();
// if it should behave like a compile-time constant:
s=s.intern();

// all unicode characters (aka code points)
StringBuilder sb=new StringBuilder(2162686);
for(int c=0; c<Character.MAX_CODE_POINT; c++) sb.appendCodePoint(c);
String s=sb.toString();
// if it should behave like a compile-time constant:
s=s.intern();

如果您不希望 String 仅包含有效的 Unicode 字符,则可以在循环内使用 if(Character.isDefined(c)) …。但这是一个不断变化的目标——较新的 JRE 很可能会知道更多已定义的字符。

【讨论】:

  • 谢谢。所有字符都生成了!
【解决方案2】:

只要使用Apache类,org.apache.commons.lang.RandomStringUtils(commons-lang)就可以解决你的目的。

http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/RandomStringUtils.html

api使用请参考以下代码,

    import org.apache.commons.lang3.RandomStringUtils;

public class RandomString {

    public static void main(String[] args) {


        // Random string only with numbers

  String string = RandomStringUtils.random(64, false, true);

  System.out.println("Random 0 = " + string);


  // Random alphabetic string

  string = RandomStringUtils.randomAlphabetic(64);

  System.out.println("Random 1 = " + string);


  // Random ASCII string

  string = RandomStringUtils.randomAscii(32);

  System.out.println("Random 2 = " + string);


  // Create a random string with indexes from the given array of chars  

  string = RandomStringUtils.random(32, 0, 20, true, true, "bj81G5RDED3DC6142kasok".toCharArray());

  System.out.println("Random 3 = " + string);
    }
}

【讨论】:

  • 好的,但既然我都需要它们,我为什么要使用随机技术?感谢分享!
  • 随机字符串的操作。目前私有高代理字符被忽略。这些是介于值 56192 (db80) 和 56319 (dbff) 之间的 unicode 字符,因为我们不知道如何处理它们。正确处理高和低代理 - 也就是说,如果随机选择一个高代理,从 55296 (d800) 到 56191 (db7f),那么它后面是一个低代理。如果选择了低代理,从 56320 (dc00) 到 57343 (dfff),则将其放置在随机选择的高代理之后。
  • 抱歉,我看到文档并编辑了消息,但我的速度不够快。我可以使用 radom(int) 方法,但我必须多次调用它才能获得所有可能的字符。我将不得不使用渐进式清除...我不能有重复...
猜你喜欢
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
相关资源
最近更新 更多