java - 如何使unicode从java中的方法返回类型打印

标签 java string methods unicode itext

enter image description here我正在使用下面的语句在 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。 如何使其成为可能。提前谢谢。 实际上我正在使用 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 而不是 ग्राहक!

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

最佳答案

我相信您对 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 字符。

修改上面的代码片段

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评论后添加

据我在互联网搜索过程中发现的问题似乎与以下事实有关(据我所知,我没有读过的所有事实)/说印地语)。印地语是从左到右书写的,但也有异常(exception),例如元音“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 版本(请参阅 comment and linked 中的 Bruo Lowagie 版本)
  • 或者也许 iText 无法处理这种特定情况,无法根据此 test code 完全证明这一点(如果是这种情况,请查看 source ,修复它并发送拉取请求)

关于java - 如何使unicode从java中的方法返回类型打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33752608/

相关文章:

java - 将空值设置为整数

Java正则表达式模式,由多个字符串包围

c++ - C++ 读写文件

PHP 随机字符串生成器比预期更随机

c# - 是否有可能使非 ActionResult 方法返回 ActionResult ... 或最佳/最新的解决方法?

java.util.concurrent 代码审查

java - 在 Java 8 中使用 LogManager (l4j2) 时出错(无法解析 java.lang.reflect.AnnotatedElement)

c# - 仅查找列表中的相等单词存在于字符串中

Javascript 方法看不到对象变量

java - 返回数组内容而不是内存地址