【问题标题】:getBytes() doesn't work for Cyrillic lettersgetBytes() 不适用于西里尔字母
【发布时间】:2014-12-29 07:38:22
【问题描述】:

我找到了一些答案,但没有一个对我有用。我想从 html 制作一个 pdf 文件,但问题是我的 html 有西里尔字母,我发现这与这个简单的代码有关:

字符串 s = "Здраво Kris";

字节字节[] = s.getBytes("UTF-8");

字符串值 = 新字符串(字节,“ISO-8859-1”);

// 我尝试使用 new String(bytes, "UTF-8") 但它不起作用

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

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

【问题讨论】:

  • 试试这个byte[] bytes = s.getBytes("ISO-8859-1");
  • 你试过String s吗? htp.CreatePDF("&lt;html&gt;&lt;head&gt;&lt;title&gt;kristijan&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;" + s + "&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;", "kris");CreatePDF 看起来像 C# 而不是 Java。
  • 我注意到我放错了括号,但又不能工作了
  • Java 中的字符串对象总是以 UTF-16 隐式编码。您无法更改该编码。
  • 它是 java,不能只传递 s

标签: java pdf-generation cyrillic


【解决方案1】:

请看我对这个问题的回答: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 中找到此信息。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2019-06-13
      • 2014-09-11
      相关资源
      最近更新 更多