- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
说实话,我的 C++ 不是很流利。
我在内存中有一些类型为 void* 的二进制数据(我认为这意味着指向一些无法表示的东西/什么都没有的指针)。数据首先由 fread 从文件中取出。
int readfile FILE *file, void **data_return) {
//some code...
fread((void *)data, length, 1, file);
//some code...
}
读取二进制数据背后有一个复杂的算法,但我认为我不需要为此任务理解它。
char *t = ((char *)loc->mo_data) + string_offset;
return t;
此代码将 void* 类型 (loc->mo_data) 读取为字符串。我想对我来说还是可以理解的。
问题在于此数据包含俄语、西类牙语、捷克语和所有可用 UTF8 表示的国际字符。
我什至不确定,“char”代表什么编码,可能是 win1250,因为返回的字符串很糟糕。该函数返回 Организация 而不是 Организация。第一个字符串是 UTF8,但以 ASCII 表示。
更大的图景:我正在玩这个已经被别人写过的 C++ 库——这个库只公开了两个函数,打开文件(返回指针)和通过字符串键从这个文件中获取字符串(返回字符串) .该库正在 C# 项目中使用。
起初,我认为在 C# 应用程序和 DLL 库之间传递 UTF8 字符串可能有问题
[DllImport("MoReader.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr OpenFile(string path);
[DllImport("MoReader.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string FindString(IntPtr filePointer, string key);
C++代码:
extern "C" __declspec(dllexport) BinaryFileType* OpenFile(char *filePath);
extern "C" __declspec(dllexport) char *FindString(BinaryFileType *locText, char *key);
FindString 返回字符串,但编码错误。而且我不知道,如何读取 C# 字符串中表示的 ASCII,这些字符串是 Unicode 作为 UTF8...我尝试了一些转换方法但无济于事。
虽然我认为问题出在 C++ 代码中,但我希望 char 类型采用 UTF8 编码,我注意到有一种叫做代码页的东西并且有一些转换函数和 utf8 流阅读器,但由于我的 C++ 知识薄弱,我真的不知道解决方案。
===更新===
我在 Encoding 类中找到了一个属性...当我像这样读取输出字符串时:
Encoding.UTF8.GetString(Encoding.Default.GetBytes(e))
...结果是对的。我只是通过某种“默认”编码从字符串中获取字节,然后使用 UTF8 再次读取字节。我计算机上的默认编码是 ISO-8859-2,但依赖此属性将是非常愚蠢的。
所以...问题仍然存在。我仍然需要知道如何使用特定编码读取 void* 类型。但至少,我现在知道字符串是以 Windows 使用的默认编码返回的。
** === 答案 === **
谢谢大家的回答。
正如 James 所指出的,char * 只是数字。所以我通过只获取数字而不是试图将它们解释为字符串来避免所有编码问题。还有另一个问题...如何从 C++ 库中的 char* 中获取 C# 中的字节数组?有一个 Marshal.Copy 方法,但我需要知道字符串的大小。C++ 中的每个 char* 都必须以空字符“\0”结尾。所以最后,我只是一个字节一个字节地读取一个字节,直到找到这个空字符。代码看起来像这样。
IntPtr charPointer = ExternDll.FindString(fileIntPtr, "someString");
List<byte> bytes = new List<byte>();
for (int i=0; ;i++)
{
byte b = Marshal.ReadByte(charPointer, i);
if (b == '\0')
break;
bytes.Add(b);
}
string theResultStringInTheUTF8 = Encoding.UTF8.ToString(bytes.ToArray());
最佳答案
C++ 与字符编码无关。就此而言,如果你是通过某种骇人听闻的类型转换来获取角色,任何语言会;语言无法知道是什么编码是。
在 C++ 中,char 实际上只是一个小整数;这只是约定俗成它包含一些字符编码。但是哪种编码取决于你。如果您的输入确实是 UTF-8,则字符指向char*
将包含 UTF-8;如果是别的东西,那么它们将包含别的东西。
当您将字符输出到屏幕时,C++ 只是将它们传递(在至少默认)。由终端窗口决定如何解释它们;即将序列分解为代码点,然后映射每个代码指向图形图像。在 Unix (xterm
) 下,这是由显示字体;在 Windows 下,至少正式地通过代码页(但是你当然可以安装错误编码的字体,这会把它搞砸)。 C++与此无关。 UTF-8 的代码页是 65001;如果你将终端设置为使用此代码页(命令上的 chcp 5001
行),然后输出 UTF-8,它应该可以工作。
关于c# - C++ 在 Visual Studio 2010 中从二进制文件读取 void* 数据作为 utf8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8093827/
我想根据我使用的 visual studio 版本编译不同的东西,比如 #if VISUAL_STUDIO_VERSION > 2015 eventH?.Invoke(this, EventArgs.
在 Visual Studio 2010 中调试并将鼠标悬停在变量名称上时,我可以选择使用 3 种不同的内置可视化工具:文本、XML 和 HTML。 这是我所指的示例: 由于我越来越多地使用基于 JS
我将可视化编程语言理解为允许程序员在屏幕上操作图形(而不是文本)对象以构建功能的语言。 我在 C#、VB 等中看到的最接近的东西是 RAD 控件,但这只是组成 UI 和最简单的功能——甚至与语言本身无
我目前正在使用 Visual Studio 2015 来编程 ASP.NET Core 应用程序。我对安装 Visual Studio 2017 有以下疑问: 什么被认为是最佳实践和/或最干净的方法?
尝试从扩展和更新获取 Visual Studio 扩展时,出现以下错误:- 向 visualstudiogallery.msdn.microsoft.com/Services/VStudio/Exte
我已经开发了Windows服务,并且该服务正在我的帐户下在本地计算机上运行。当我尝试通过在Visual Studio 2008中将其作为一个过程附加该服务来调试该服务时,我得到“无法附加到该过程。 V
作为标准安装的一部分,Visual Studio Code 带有一个名为“Monokai Dimmed”的颜色主题。 有没有办法将它移植到 Visual Studio 2015?我检查了社区主题( h
Visual Studio Community Edition是否可以使用Visual Studio Online帐户上的存储库? 我一直为包含在Online帐户中的Visual Studio Onl
我正在使用文本可视化工具在 Visual Studio 中调试字符串变量。然而,似乎字符串中间的大部分不见了。这背后的原因是什么? 最佳答案 Visual Studio 中的 Text Visuali
我正在开始一个涉及使用多个 SDK 的新项目,包括: 英特尔凌动开发者 SDK 文本转语音 SDK(建议?) 某种网络摄像头和增强现实支持(建议?) 我目前有 2008,但我也可以安装 2010。是否
我想知道,如果我发送一个解决方案文件夹(它是用 visual studio C# 编写的),您可以在 visual studio for mac 中打开解决方案吗? 在visual studio 20
有没有办法在 Visual Studio Code 和 Visual Studio 中设置相同的快捷方式(而不必每次都手动更改它们)? 例如,我在 Visual Studio Code 中经常使用 A
我无法启用 实时可视化树 在 Visual Studio 2017 用于 UWP 应用程序 (C#)。这个工具在 VS2015 上工作,但在 VS2017 中从来没有为我工作过。它对我的 WPF 项目
我刚开始了解 Visual Studio Code。我想知道,我可以将 Visual Studio 替换为所有 .NET 开发相关的工作吗? 我可以节省 Visual Studio 许可的成本吗? V
我安装了具有有效许可证(Visual Studio 订阅)的 Visual Studio 2019 企业版(VS 2019 16.1.4),它运行良好。 突然之间,当我尝试打开项目或项目中的任何文件时
Visual Studio 2015 Pro 提供以下 错误 : error BC36716: Visual Basic 9.0 does not support implicit line cont
我正在我的 PC 中使用 .net Framework 2.0 和 Visual C#(Microsoft Visual Studio 2008)开发 Windows 应用程序。 完成我的项目后,我必
有什么方法可以在启动 VS 时禁用 VA X 并仅在需要时将其重新打开?因为它会导致一些滞后。我似乎在 VS 的选项或 VA 的选项中都找不到该选项。 最佳答案 持shift在 Visual Stud
我可以将 Visual Studio 命令提示符 与免费的 Visual C# Express 一起使用吗? Visual Studio 命令提示符 被引用 here : Run 'Visual St
这很容易成为 Visual Studio 历史上最烦人的“功能”之一,我不明白它为什么存在 -- 曾经 . 为什么 CodePlex 项目需要关心我使用的是什么版本的 Visual Studio? 在
我是一名优秀的程序员,十分优秀!