getBytes()不适用于西里尔字母

时间:2014-12-29 07:38:23

标签: java pdf-generation cyrillic

我找到了一些答案,但它们都不适合我。我想从html制作一个pdf文件,但问题是我的html有Cyrilic字母,我发现这与这个简单的代码有关:

  

String s =“ЗдравоKris”;

     

byte bytes [] = s.getBytes(“UTF-8”);

     

String value = new String(bytes,“ISO-8859-1”);

     

//我尝试使用新的String(字节,“UTF-8”),但它不起作用

然后我将值传递给我的pdf生成器函数,但它只输出字符串s中不在Cyrilic中的部分,即Kris

 htp.CreatePDF("<html><head><title>kristijan</title></head><body><h1>" + value + "</h1></body></html>", "kris");

2 个答案:

答案 0 :(得分:2)

请查看我对此问题的回答:Can't get Czech characters while generating a PDF

您的代码可能会出现一些问题。

这是一个非常糟糕的主意:

String s = "Здраво Kris";

假设您将包含此代码的.java文件发送给以ASCII格式保存的人,那么您的源代码将更改为:

String s = "Здраво Kris";

我还看到将文档存储到源控制系统时会发生这种情况。

底线:在编写带有硬编码字符串的源代码时,绝不使用特殊编码。使用正确的编码将字符串存储在文件中以写入和读取字符串,或者如果您坚持在源代码中使用硬编码数据,则使用unicode表示法。

即使您正确存储包含此字符串的文件,编译代码时也必须非常小心。如果编译器使用不同的编码,s也将被破坏。

将HTML转换为PDF时,您还必须确保正确读取数据。我假设您使用的是XML Worker(而不是过时的HTMLWorker类)。您可以在不同的地方指出要使用的编码。

最后,您必须确保使用支持西里尔字符的字体。例如:如果您使用默认字体Helvetica,则不会呈现任何内容。

您还可以在免费电子书The Best iText Questions on StackOverflow中找到此信息。

答案 1 :(得分:0)

解决createPDF的无能(?)以处理Java(!)中的完整unicode字符范围的一种方法是调查

String s = "Здраво Kris";

表示大于0x80的字符。这些必须由相应的数字HTML实体替换。

您可以通过将String s设置为这些实体来轻松验证这一点,并了解嵌入此字符串会发生什么。