我想使用 LibreOffice UNO API 编写一个 Java 应用程序。当我尝试插入一些 Unicode 文本(西里尔字母)时,我得到了 mojibake。看来 LibreOffice 将 UTF-8 转码为单字节编码(在我的例子中 - CP1251)。
代码示例:
import com.sun.star.beans.PropertyValue;
import com.sun.star.comp.helper.BootstrapException;
import com.sun.star.io.IOException;
import com.sun.star.text.*;
import com.sun.star.frame.*;
import com.sun.star.uno.*;
import com.sun.star.lang.*;
import com.sun.star.comp.helper.Bootstrap;
import static com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK;
public class Application {
private XTextDocument xDoc;
public static void main(String[] args) throws java.lang.Exception {
XComponentContext xContext = Bootstrap.bootstrap();
XMultiComponentFactory xMCF = xContext.getServiceManager();
Object oDesktop = xMCF.createInstanceWithContext(
"com.sun.star.frame.Desktop", xContext);
XDesktop xDesktop = UnoRuntime.queryInterface(XDesktop.class, oDesktop);
XComponentLoader xCompLoader = UnoRuntime
.queryInterface(XComponentLoader.class, xDesktop);
PropertyValue[] props = new PropertyValue[0];
XComponent xComp = xCompLoader.loadComponentFromURL("private:factory/swriter", "_blank", 0, props);
XTextDocument xDoc = UnoRuntime.queryInterface(XTextDocument.class, xComp);
XText xText = xDoc.getText();
XTextCursor xCursor = xText.createTextCursorByRange(xText.getStart());
xText.insertString(xCursor, "Съешь же ещё этих мягких французских булочек да выпей чаю.", false);
}
}
结果:
我不知道这里发生了什么,但我想有一些配置选项指定了目标文档的编码,但我不知道它在哪里......
我已经通过用 JDK 21 替换 JDK 17 解决了这个问题。 我已将此程序翻译为 C++ 并收到了正确的字符串,因此问题出在 Java 中。
JDK 21 实现了 Java 18 中实现的 JEP 400。