【问题标题】:How do make unicode to print from method return type in javajava - 如何使unicode从java中的方法返回类型打印
【发布时间】:2016-02-18 13:38:29
【问题描述】:

我正在使用下面的语句在java中将unicode打印为字符串

System.out.println("\u0917\u094d\u0930\u093e\u0939\u0915");

它在控制台上打印ग्राहक。 现在我不是在 println() 中传递简单的字符串,而是像这样使用

System.out.println(this.HindiConvertUni("ग्राहक"));
public  String HindiConvertUni(String str)
{
    StringBuffer ostr = new StringBuffer();
    for (int i = 0; i < str.length(); i++)        
    {
        char ch = str.charAt(i);
        if ((ch >= 0x0020) && (ch <= 0x007e)) // Does the char need to be converted to unicode?
        {
          ostr.append(ch);    // No.
        } else // Yes.
        {
            ostr.append("\\u");    // standard unicode format.
            // Get hex value of the char.
            String hex = Integer.toHexString(str.charAt(i) & 0xFFFF); 
            // Prepend zeros because unicode requires 4 digits
            for (int j = 0; j < 4 - hex.length(); j++) 
            {
                ostr.append("0");
            }
            // standard unicode format. 
            ostr.append(hex.toLowerCase());    
        }
    }
    return (new String(ostr)); 
}

现在我想打印我用作参数的字符串。但它打印像 \u0917\u094d\u0930\u093e\u0939\u0915 我希望将其打印为 ग्राहक 而不是 unicode。 如何使它成为可能。Thanx 在高级。 实际上我正在使用 iText 来制作我正在做的报告

                BaseFont unicode = BaseFont.createFont("/home/mani/current/ARIALUNI.TTF", 
                BaseFont.IDENTITY_H,    true);
                Font font=new Font(unicode,12,Font.NORMAL,new BaseColor(50,205,50));                  
                PdfPCell customerLblCell = new PdfPCell(new Phrase("\u0917\u094d\u0930\u093e\u0939\u0915",
                font));

但是我看起来类似于

                     PdfPCell customerLblCell = new PdfPCell(new Phrase(this.HindiConvertUni("ग्राहक"),
                font));

但它打印的是 unicode 而不是 ग्राहक!

我正在尝试像上图那样打印 ऐसा करने की कोशिश。

【问题讨论】:

  • 请在以后的帖子中更加努力地格式化您的代码 - 我已经修复了这个问题,但它真的很难开始阅读。现在,至于你的问题——是的,你明确地转义了字符串,所以我对它被转义并不感到惊讶。如果你不想逃避它,你想做了什么?为什么不直接使用System.out.println("ग्राहक");?感觉您需要了解实际文本(只是一个 UTF-16 代码单元序列)与该文本的可能 源代码 表示形式之间的区别,其中可能包括转义序列。
  • 谢谢哥们!我会在这里尝试我很新。 @乔恩斯基特
  • 我正在使用 Itext 库来打印报告。但是由于 itext 无法识别印地语文本(ग्राहक)。首先,我将字符串转换为 unicode,然后从这些 un​​icode itext 执行所需的报告。但问题如上所述
  • 当所有字符串 都是 Unicode 开头时,不清楚您所说的“将字符串转换为 Unicode”是什么意思。如果您的意思是“使用\u 转义Unicode 字符”,那很好。但是,如果它适用于 itext 并且这就是您想要实现的目标,那么问题是什么?请编辑您的问题以使其更清楚。
  • @manikantgautam: 如果 在源代码中 转义时它可以这样工作,那么使用非转义形式也应该没问题,只要你配置了你的编译器使用正确的编码(以了解您如何表示源代码本身)。这与 iText 无关。

标签: java string methods unicode itext


【解决方案1】:

我相信您对 Java 代码中的转义 unicode 字符有误解。

String s = "ग्राहक";
String t = "\u0917\u094d\u0930\u093e\u0939\u0915";
System.out.println("s = " + s);
System.out.println("t = " + t);
System.out.println("s equals t: " + s.equals(t));

输出

s = ग्राहक
t = ग्राहक
s equals t: true

如您所见,两个字符串相等。所以new Phrase("ग्राहक", font)new Phrase("\u0917\u094d\u0930\u093e\u0939\u0915", font) 产生相同的代码。要么两者都工作,要么两者都不工作。

原因是像 "\u0917" 这样的转义 unicode 字符将在编译时被编译器替换为 unicode 字符本身 "ग्"

另一方面,您的方法HindiConvertUni("ग्राहक")运行时 生成一个字符串"\u0917\u094d\u0930\u093e\u0939\u0915",该字符串不会自动转换为相应的Unicode 字符。

修改上面的sn-p

String x = HindiConvertUni("ग्राहक");
System.out.println("x = " + x);
System.out.println("x equals t: " + x.equals(t));

输出是

s = ग्राहक
t = ग्राहक
s equals t: true
x = \u0917\u094d\u0930\u093e\u0939\u0915
x equals t: false

也许这让区别很明显。

在 OP 评论后添加

据我在搜索互联网期间发现的问题似乎与以下事实有关(所有 AFAIK,因为我不读/不说印地语)。印地语是从左到右书写的,但这里有一些例外,例如元音“I”(unicode \u093F)。当在字符编码中它位于辅音的右侧时,“I”将呈现在该辅音的左侧。两个字符都呈现在相同的垂直位置。

用于演示。

System.out.println("current  : \u0936 - \u0936\u093F");
System.out.println("expected : \u0936\u093F - \u0936");
System.out.println("separated: \u0936 - \u093F - \u0936");

输出

current  : श - शि
expected : शि - श
separated: श - ि - श

根据一些想法,您的情况可能是什么原因。

  • unicode 字符的顺序是错误的,您从数据库中获取的确实是“\u0936\u0936\u093F”而不是“\u0936\u093F\u0936”
  • 您没有使用最新的iText 版本(请参阅Bruo Lowagie 中的comment and linked
  • 或者 iText 可能无法处理这种特定情况,无法根据 test code 完全证明它(如果是这种情况,请查看 source ,修复它并发送拉取请求)

【讨论】:

  • 感谢@SubOptimal!不知何故,我设法在报告中打印它。但问题是,我没有得到想要的输出。当我试图打印 ऐसा करने की कोशिश 但它打印的东西与上图不同。
  • @manikantgautam 您能否在原始问题中解释您所期望的不正确之处。截图中可以看到ऐसा करने की कोशिश这句话。
  • 如您所见,我正在从 DB(mysql) 以这种格式获取记录 ऐसा करने की कोशिश 但没有打印,因为它在上面我在图像中提到的 pdf 文档中。它打印 कोशशि 而不是कोशिश
  • 是的,先生!我早上看到它很有帮助,我非常感谢你。我会让你知道它是否对所有字符串都有效。
猜你喜欢
  • 2012-07-11
  • 2020-10-17
  • 2016-02-01
  • 1970-01-01
  • 2017-03-26
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多