【问题标题】:How can I get and send string in UTF-8 from c# to c++ dll如何从 c# 获取和发送 UTF-8 字符串到 c++ dll
【发布时间】:2014-02-22 14:11:54
【问题描述】:

我对此有疑问:

FileStream stream = new FileStream("Configuration.xml", FileMode.Open);
Encoding u8 = new UTF8Encoding(true, true);

StreamReader reader = new StreamReader(stream, u8);
string str = reader.ReadToEnd();

Configuration.xml 在 utf-8 中,但 str 不是,那么我应该将此 str 发送到我的 dll,dll 函数不适用于 noUTF-8

【问题讨论】:

    标签: c# c++ string dll utf-8


    【解决方案1】:

    如果确实需要以 C# 字符串开头,则必须将该字符串转换为 UTF-8,并存储在字节数组中:

    byte[] utf8 = Encoding.UTF8.GetBytes(str);
    

    然后将该字节数组传递给 DLL。请注意,字节数组不会以 null 结尾,因此如果 DLL 需要 null 终止符,则需要显式添加它。

    另一方面,避免从 UTF-8 到 UTF-16 再回到 UTF-8 可能会容易得多。所以,不要使用StreamReader 读取字符串。将文件内容直接读入字节数组。

    byte[] utf8 = File.ReadAllBytes("Configuration.xml");
    

    同样,这不会有空终止符,因此如果需要,您必须添加它。

    如果您确实需要一个空终止符,那么使用FileStream 可能会更容易:

    1. 在读取模式下创建FileStream
    2. 通过读取Length 属性查找文件的大小。
    3. 分配长度为Stream.Length+1 字节的字节数组。新内存将被初始化为零,因此最后一个字节已经有您的空终止符。
    4. 在文件流上调用Read,将Stream.Length字节读入字节数组。

    类似这样的:

    byte[] ReadAsNullTerminatedByteArray(string filename)
    {
        using (FileStream fs = File.OpenRead(filename))
        {
            byte[] bytes = new byte[fs.Length+1];
            fs.Read(bytes, 0, fs.Length);
            return bytes;
        }
    }
    

    【讨论】:

    • 谢谢,但我应该以一种方式将此 str 发送到我的 dll。在字符串类型中,而不是在字节中
    • 是的,我明白这一点。您需要将其作为字节数组传递,因为 p/invoke 编组不使用 UTF-8。您需要将char* 参数声明为byte[]
    • 你能举个例子说明我在c++中的行为吗?
    • 在 C++ 端,您会收到 const char* 类型的参数。如果您愿意,您也可以选择接收长度。这消除了空终止的必要性。但这可能不方便。我无法为您提供 C++ 代码,因为我不知道您在此接口的 C++ 端做什么。我有理由相信我回答了您提出的问题。
    • 谢谢,但是我不能用你的方法=(
    猜你喜欢
    • 2016-03-26
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2016-08-30
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多