【问题标题】:Changing type of char using wchar_t used not so like L使用 wchar_t 更改字符类型不像 L
【发布时间】:2018-09-24 14:35:58
【问题描述】:

在我的代码中,我尝试创建大量的 4 个咬字符,其中每个字符都包含一个西里尔字母。

  wchar_t OUT_STRING[4] = { L'т',L'л',L'о',L'р' };

这一切正常,我有预期的输出。这只是测试,实际上我需要将元素从字符串转换为与 OUT_STRING 中相同的类型;我尝试使用这样的东西:

 wchar_t OUT_STRING[4] = { (wchar_t)'т',L'л',L'о',L'р' };

但它不起作用,在输出中我有一个矩形。

【问题讨论】:

  • "在 wchar_t 上改变它的 char 类型之前的 L" 它不会改变类型。定义'a'char 文字,而L'a'wchar_t 文字。要了解有关各种类型字符文字的更多信息,请转到 here
  • x 最初是未定义的。您不会在任何地方为 x 分配初始值。试试static int32_t x = 0;
  • 好的,但是如何在这种风格上定义'т':(wchar_t)'т'
  • L'т' 是 wchar_t 文字字符 т
  • @ЧерныйКамень 不同种类的文字有不同的前缀或后缀。 L 不执行强制转换,它将下一个序列标识为 wide character literal

标签: c++ types wchar-t


【解决方案1】:

认为您想使用 UTF-8 编码的 std::string 传入一个字符串,并一次处理一个字符,每次将单个字符转换为一个宽字符串长度为 1,以便您可以将其传递给 TTF_SizeUNICODETTF_RenderUNICODE_Blended

我将演示相关的字符串转换代码。

这是一个 test 函数,它需要一个以空字符结尾的宽字符串,其中只有一个字符。 main 的正文显示了如何将 UTF-8 字符串转换为 UTF-16(使用 codecvt_utf8_utf16)以及如何将单个字符转换为字符串(使用 std::wstring(1, ch)

#include <string>
#include <codecvt> 
#include <iostream>

void test(const wchar_t* str) {
    std::cout << "Number of characters in string: " << wcslen(str) << std::endl;

    for (const wchar_t* ch = str; *ch; ++ch) {
        std::cout << ((int)*ch) << std::endl;
    }
}

int main() {
    std::string input = u8"тлор";
    for (wchar_t ch : std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t>().from_bytes(input)) {
        std::wstring string_with_just_one_character(1, ch);

        test(string_with_just_one_character.c_str());
    }
    return 0;
}

【讨论】:

  • 这将破坏 BMP 之外的补充字符,需要 2 个 wchar_ts(代理对)以 UTF-16 对其进行编码。
猜你喜欢
  • 2017-03-28
  • 2020-08-02
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2011-12-18
  • 2017-06-12
相关资源
最近更新 更多