如何在 Java UNO API 中切换 LibreOffice 字符串的编码?

问题描述 投票:0回答:1

我想使用 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);
    }
}

结果:

Result of executing of this code

我不知道这里发生了什么,但我想有一些配置选项指定了目标文档的编码,但我不知道它在哪里......

java encoding libreoffice uno
1个回答
0
投票

我已经通过用 JDK 21 替换 JDK 17 解决了这个问题。 我已将此程序翻译为 C++ 并收到了正确的字符串,因此问题出在 Java 中。

JDK 21 实现了 Java 18 中实现的 JEP 400。

© www.soinside.com 2019 - 2024. All rights reserved.