我的应用程序在 Zebra EM220 移动打印机上打印。我的国家字符在代码页CP852(支持打印机)中编码,但Delphi显然可以使用Unicode。
打印机库有一个打印文本的方法,该方法将 JString 作为文本参数传递。不幸的是,使用 StringToJString 效果不佳,因为打印了一个额外的“?”或每个我的国家字符前的“t”。看起来打印机需要一个单字节编码的文本,而在两个字节时它不知道该做什么。
现在的问题是:如何在 CP852 代码页中将 Unicode 字符串编码为单字节字符串并将其作为 JString 参数传递?
最佳答案
How can I encode Unicode string to a single-byte string i CP852 code page and pass this as JString param?
可以将 Unicode 数据转换为特定的单字节字符集,使用诸如 Delphi 的代码页 AnsiStrings 功能,或 Delphi RTL 的 LocaleCharsFromUnicode()
函数,甚至是 Java 的 String.getBytes()
通过 JNI 的方法。
但是您不能在 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 文本时也应该存在,因为两种方式的输入都是相同的。
关于android - 德尔福 10.1 Android 应用程序。如何将单字节文本作为 JString 传递。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47084007/