我正在使用下面的语句在 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/