【问题标题】:Delphi 10.1 Android App. How to pass single byte text as JString.德尔福 10.1 安卓应用。如何将单字节文本作为 JString 传递。
【发布时间】:2018-04-15 11:47:24
【问题描述】:

我的应用程序在 Zebra EM220 移动打印机上打印。我的国家字符编码在代码页 CP852(支持打印机)中,但 Delphi 显然可以使用 Unicode。

打印机库有一个打印文本的方法,该方法将 JString 作为文本参数传递。不幸的是,StringToJString 的使用效果不佳,因为打印了一个额外的“?”或“t”在每个我的国家字符前。看起来打印机需要一个单字节编码的文本,而对于两个字节它不知道该怎么做。

现在的问题是:如何在 CP852 代码页中将 Unicode 字符串编码为单字节字符串并将其作为 JString 参数传递?

【问题讨论】:

  • 请提供一个minimal reproducible example 来演示Delphi 中的问题。如果您有处理 Unicode 文本的有效 Java 代码,而 Delphi 没有,请也显示该代码。

标签: android delphi unicode


【解决方案1】:

如何将 Unicode 字符串编码为 CP852 代码页中的单字节字符串并将其作为 JString 参数传递?

可以使用 Delphi 的代码页 AnsiStrings 功能、Delphi RTL 的 LocaleCharsFromUnicode() 函数,甚至 Java 的 String.getBytes() 方法通过 JNI 将 Unicode 数据转换为特定的单字节字符集。

但是您不能在 JString 参数中传递单字节数据,您也不应该尝试这样做。

JString 是 Delphi 对 Android's native Java String type 的包装,它是一个 UTF-16 编码的字符串,就像 Delphi's native UnicodeString type 一样。

如果您的打印机库确实将JString 作为输入,那么StringToJString() 可以正常工作。它只是简单地将 UTF-16 数据从 Delphi UnicodeString 复制到 Java String

在将数据发送到实际打印机时,库负责将 Java String 数据从 UTF-16 转换为 CP852(或其他)。

如果您在将特定字符发送到库时遇到问题,这与其他问题有关,例如发送 CP852 中不存在的 Unicode 字符。在 Delphi 中将 Unicode 文本与库一起使用时遇到的任何问题在 Java 中与库一起使用 Unicode 文本时也应该存在,因为两种方式的输入都是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多