我有一个Unicode字符串存储在CString ,我需要知道该字符串采用UTF-8编码的字节数。 我知道CString有一个方法getLength() ,但是它返回字符数,而不是字节数。

我尝试(除其他事项外)转换为char数组,但(在逻辑上,我猜想)只有wchar_t数组,所以这不能解决我的问题。

要明确我的目标。 对于输入,假设说"aaa"我希望“ 3”作为输出(因为“ a”在UTF-8中占用一个字节)。 但是对于输入“āaa”,我想查看输出“ 4”(因为ā是两个字节的字符)。

我认为这是非常普遍的要求,但是即使经过1.5小时的搜索和试验,我仍然找不到正确的解决方案。

我对Windows编程的经验很少,所以也许我遗漏了一些关键信息。 如果您有这种感觉,请告诉我,我们会添加您要求的所有信息。

===============>>#1 票数:5 已采纳

由于您的CString包含一系列wchar_t ,您可以仅使用WideCharToMultiByte并将输出字符集设置为CP_UTF8 该函数将返回写入输出缓冲区的字节数或UTF-8编码的字符串的长度

LPWSTR instr;
char outstr[MAX_OUTSTR_SIZE];
int utf8_len = WideCharToMultiByte(CP_UTF8, 0, instr, -1, outstr, MAX_OUTSTR_SIZE, NULL, NULL);

如果不需要输出字符串,只需将输出缓冲区大小设置为0

  • cbMultiByte

    lpMultiByteStr指示的缓冲区大小(以字节为单位)。 如果此参数设置为0,则该函数返回lpMultiByteStr所需的缓冲区大小,并且不使用输出参数本身。

在这种情况下,该函数将返回UTF-8中的字节数,而不会真正输出任何内容

int utf8_len = WideCharToMultiByte(CP_UTF8, 0, instr, -1, NULL, 0, NULL, NULL);

如果您的CString实际上是CStringA ,即未定义_UNICODE ,则需要使用MultiByteToWideChar将字符串转换为UTF-16,然后使用WideCharToMultibyte从UTF-16转换为UTF-8。 请参阅如何将ANSI字符串直接转换为UTF-8? 但是无论如何,在没有Unicode支持的情况下,绝不应编译新代码

  ask by Kejml translate from so

未解决问题?本站智能推荐:

2回复

C ++阿拉伯语UTF8字符串到CString

在Visual Studio 2008 MFC项目中,我必须管理包含阿拉伯城市并在线搜索的UTF8中的字符串,我编写了以下这段代码: 当我尝试转换字符串时,它保持不变,并且如果我尝试打印这两个字符串,结果是相同的。 我究竟做错了什么? 提前致谢。
2回复

将MFC的CString转换为ASCII和UNICODE的int

在ASCII模式下将CString转换为int很简单 但是,这对于UNICODE模式下的项目不起作用,因为CString变为宽字符字符串。 如何编写我的代码以覆盖ASCII和UNICODE模式,而没有多余的if语句?
2回复

MFC应用程序中使用多字节字符集的UTF-8文本

我正在开发一个应用程序,它接收以UTF-8编码的文本,并需要在某些MFC控件上显示它。 应用程序是使用MultiByte字符集(MBCS)构建的,我们假设这不能改变。 我希望如果我将从UTF-8接收的文本转换为宽字符串,我将能够使用SetWindowTextW方法正确显示它。 为了尝试
1回复

是在定义UNICODE时使用CTF的UTF-16的MFC应用程序

如果我们定义UNICODE,我知道CString使用WCHAR。 但是,它是UTF-16编码的吗? 有官方参考吗? 我试图在CString中找到一个字符的Unicode代码点值。
2回复

C ++从std :: string创建CString失败

在我基于MFC的应用程序中,此代码: 产生以下输出: 每次运行CString的值都不同,但是长度似乎是恒定的。 其他一些结果是042219B0和042C4378 。 我已经尝试了该线程中讨论的每个变体,结果都是一样的。 我还尝试将Visual Studio项目中的“字符
3回复

__int64到CString返回错误的值 - C ++ MFC

我想将__int64变量转换为CString。 代码就是这样 第一个printf打印 它是正确的,但第二个printf打印随机高数字,如 "totalSpace contains: 298070026817519929" 我也尝试使用INT64变量而不是__int64
2回复

在C#项目中将C#字符串转换为MFC CString?

我正在用C#开发客户端。 该服务器是由使用C ++ MFC的其他人开发的,因此我无法对其进行更改。 服务器只能接受字符串数据作为CString(UTF8)。 注意:在我问这个问题之前,我已经搜索并阅读了许多线程,例如。 thread1 , thread2 , thread3等。但是他们谈
2回复

CString到std :: string或sql :: SQLString转换-C ++

我正在尝试将来自CComboBox的CString变量转换为std::string或sql::SQLString以便在SQL查询中设置它(使用Mysql Connector C ++)。因此,这是我的代码: 我已经尝试了很多东西 要么 要么 要么 要么
1回复

StringCch *函数和Cstring

我在代码中使用了字符串安全函数(StringCch *)。 但是,有些功能我想将变量从WCHAR *转换为CString 。 该代码在StringCchCopy函数上失败: 我敢肯定,我很容易回答,但是我有点困惑! GetAllocLength()返回71。它不应该返回64吗?
3回复

在GetDlgItem()之后修剪CString

希望有人可以帮助我解决这个问题! 我有一个对话框,其中包含一些用数据填充的组合框,用户应填写这些数据,然后单击“保存”。 单击“保存”时,程序将创建一个包含所选数据的输出文件。 我的问题是在保存文件之前,需要修剪连字符处的所有内容! 组合框中填充了类似于以下内容的字符串: