详解mbstowcs函数

一、 mbstowcsz函数

mbstowcsz 函数在标准 C 中未定义,但在 Microsoft Windows 中,它被定义为从多字节字符集 (MBCS) 转换为宽字符集。

    int mbstowcsz(
        wchar_t *pwcs,
        const char *ptr,
        size_t size
    );

mbstowcsz函数将字符串的前 size 个字符从多字节字符集编码转换成相应的宽字符集编码,然后将结果存储在 wide-character 字符数组 pwcs 中。

二、mbstowcs_s源码

mbstowcs_s 是 mbstowcs 的安全版本,这意味着它对缓冲区的大小进行了检查,因此不会发生缓冲区溢出。

    errno_t mbstowcs_s(
        size_t *pReturnValue,
        wchar_t *wcstr,
        size_t sizeInWords,
        const char *mbstr,
        size_t count
    );

如果 mbstr 包含了一个由 sizeInWords 指定的字符数的字符串,那么 mbstowcs_s 将该字符串转换为 wcstr 所指定的拥有相同字符数的宽字符集字符串。

同时,还要注意 count 的值,如果小于 strlen(mbstr)+1,则 mbstowcs_s 会返回 ERANGE 错误。

三、mbstowcs_s函数

以下是mbstowcs_s的函数原型:

    errno_t mbstowcs_s(
        size_t *pReturnValue,
        wchar_t *wcstr,
        size_t sizeInWords,
        const char *mbstr,
        size_t count
    );

mbstowcs_s() 函数将 mbstr 所指定的多字节字符串(MBCS)转换成相应的宽字符字符串(WCS),并将结果放入由 wcstr 指示的字符数组中。转换的过程遵循制定的代码页和本地环境,不使用其他系统区域性信息。转换的字符串中不包括截止标志。如果 mbstr 不是合法的多字节字符字符串,则 mbstowcs_s() 返回 EINVAL 错误代码。

长度限制与大小相同,转换的字符数也不能超过 sizeInWords 所指定的大小。如果目标不能包含完整的字符串,函数将把转换后的部分存储到目标缓冲区中并将指向目标缓冲区的指针偏移写入 wcstargv (如果不为 NULL)。

四、mbstowcs_r函数

下面的示例代码将多字节字符串 mymbstr 转换为宽字符缓冲区 mywcstr。输出指针指向转换数据字符串的末尾:

    int mbstowcs_r(
        wchar_t *pwcs,
        const char *s,
        size_t n,
        size_t *nresult,
        mbstate_t *ps
    );

此函数在每个元素中对输出缓存限制为 n – 1 个宽字符,以便在缓存中放置两个终止符的宽字符。 如果 n 不是足够大的输出缓存,则 mbstowcs_r 函数将返回缓存的不完整转换。 执行后,返回值是已转换字符的数量。

五、mbstowcs函数

mbstowcs 函数将字符串从多字节字符集编码转换为宽字符集编码。

    size_t mbstowcs(
        wchar_t *pwcs,
        const char *ptr,
        size_t max
    );

该函数把字符串 ptr 中的前 max 个字符从多字节字符集编码转换成相应的宽字符集编码,然后把结果存储在 wide-character 字符数组 pwcs 中。 转换的字符串不包括终止符。如果 pwcs 是 NULL,则不记录转换结果,只返回目标数组中需要的长度。

六、mbstowcs_s函数

    errno_t mbstowcs_s(
        size_t *pReturnValue,
        wchar_t *wcstr,
        size_t sizeInWords,
        const char *mbstr,
        size_t count
    );

mbstowcs_s() 函数将 mbstr 所指定的多字节字符串(MBCS)转换成相应的宽字符字符串(WCS),并将结果放入由 wcstr 指示的字符数组中。转换的过程遵循制定的代码页和本地环境,不使用其他系统区域性信息。转换的字符串中不包括截止标志。如果 mbstr 不是合法的多字节字符字符串,则 mbstowcs_s() 返回 EINVAL 错误代码。

此函数会在扫描输入字符串时,将计数器 count 的值按其字符数递减。如果输入字符串中字符的数量超过 count ,则无法将 null 结束的字符串 mbstr 转换为 null 结束的字符串 wcstr。因此, mbstowcs_s 函数确保不会把多于 count 字符的内容写到目标缓冲区中,并在这种情况下返回实际转换的字符数和 ERANGE 错误代码。

如果目标不能包含完整的字符串,函数将把转换后的部分存储到目标缓冲区中并将指向目标缓冲区的指针偏移写入 wcstargv (如果不为 NULL)。

七、mbstowcs utf8

mbstowcs utf8 将以 UTF-8 格式编码的字符串转换为宽字符字符串。

    size_t mbstowcs(
        wchar_t *pwcs,
        const char *ptr,
        size_t max
    );

在多字节字符集编码中,UTF-8 使用一至四个子节标识字符。在转换期间,以下字符使用一个宽字符表示:

  • 使用一个子节(0x0001 到 0x007F)的字符转换为相应的宽字符。
  • 使用两个字节(0x0080 到 0x07FF)中的字符转换为相应的两个宽字符(其中高位字符是由 0xD800 到 0xDBFF 动态分配的一个代码单元)。
  • 使用三个字节(0x0800 到 0xFFFF)中的字符转换为相应的三个宽字符。
  • 使用四个字节(0x10000 到 0x1FFFFF)中的字符转换为相应的四个宽字符。

八、mbstowcs 返回-1

如果输入字符串为 null,则 mbstowcs() 函数将返回 -1。 否则,返回输出缓冲区中写入的 wide-character 数量。

九、mbstowcs 中文字符返回-1

如果输入字符串包含无法在当前本地环境中转换为宽字符集的字符或字节,则 mbstowcs() 函数将返回 -1 并设置 errno 为静态数据中的 EILSEQ。

总结

本文通过对 mbstowcs 函数的多个相关函数进行详细阐述,包括 mbstowcsz,mbstowcs_s源码,mbstowcs_s,mbstowcs_r,mbstowcs函数,mbstowcs_s函数,mbstowcs utf8,mbstowcs 返回-1,mbstowcs 中文字符返回-1等,让读者了解这些函数的用途,以及调用时需要注意的地方。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/206867.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-08 14:18
下一篇 2024-12-08 14:19

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • Python函数名称相同参数不同:多态

    Python是一门面向对象的编程语言,它强烈支持多态性 一、什么是多态多态是面向对象三大特性中的一种,它指的是:相同的函数名称可以有不同的实现方式。也就是说,不同的对象调用同名方法…

    编程 2025-04-29
  • 分段函数Python

    本文将从以下几个方面详细阐述Python中的分段函数,包括函数基本定义、调用示例、图像绘制、函数优化和应用实例。 一、函数基本定义 分段函数又称为条件函数,指一条直线段或曲线段,由…

    编程 2025-04-29

发表回复

登录后才能评论