问题标签 [codecvt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何编写 std::codecvt 方面?
如何编写 std::codecvt 方面?我想写从 UTF-16 到 UTF-8 的,从 UTF-16 到系统当前代码页(windows,所以 CP_ACP),以及系统的 OEM 代码页(windows,所以 CP_OEM)。
跨平台是首选,但 Windows 上的 MSVC 也可以。有没有关于如何正确使用这个类的任何类型的教程或任何类似的东西?
visual-studio-2010 - ViualStudio 2010 中的 codecvt 结果错误
以下代码将“失败”打印到控制台:
我查看了源代码,发现函数 in() 失败,因为函数_Mbrtowc (wmbtowc.c) 返回 -1:
因为___mb_cur_max_l_func() (initctyp.c) 为 Russian_Russa.1251 语言环境返回 1。这是什么意思?我认为这是不正常的,codecvt 无法将 char* 转换为 wchar_t*。
c++ - 如果我灌输 basic_stream 会发生什么使用带有 codecvt_utf16 的语言环境方面?
是否指定了如果我basic_stream<char>
使用带有codecvt_utf16<char>
方面的语言环境会发生什么?
基本上,我使用typedef wchar_t tchar;
并typedef char tchar;
更改我的库的(我称之为)Unicode 和非 Unicode 版本的接口。我想通过始终使用带有codecvt_utf16<tchar>
facet 的语言环境来填充我的文件流来使源代码更简单。这无论如何都会起作用吗?
(我不介意这种被灌输的文件fstream
是否必须仅包含 ASCII 或仅包含当前全局语言环境中可表示的代码点。)
编辑:
鉴于这codecvt_utf16<char>
似乎是未指定的行为,那么将 basic_stream 与 灌输怎么样codecvt_utf16<wchar_t>
?是否指定了此行为?
c++ - 被 Unicode、Boost、C++、codecvts 难倒
在 C++ 中,我想使用 Unicode 来做事。因此,在跌入 Unicode 的兔子洞之后,我最终陷入了混乱、头痛和语言环境的火车残骸中。
但是在 Boost 中,我遇到了一个不幸的问题,即尝试使用 Unicode 文件路径并尝试将 Boost 程序选项库与 Unicode 输入一起使用。我已经阅读了有关语言环境、codecvts、Unicode 编码和 Boost 主题的所有内容。
我目前尝试让事情正常工作是有一个 codecvt,它接受一个 UTF-8 字符串并将其转换为平台的编码(POSIX 上的 UTF-8,Windows 上的 UTF-16),我一直试图避免wchar_t
.
我实际上得到的最接近的是尝试使用 Boost.Locale 执行此操作,以便在输出时从 UTF-8 字符串转换为 UTF-32 字符串。
我想我使用宽字符进行了其他类型的转换,但我真的不知道我在做什么。我现在不知道什么是适合这项工作的工具。帮助?
c++ - 是否存在目标缓冲区需要空间容纳多个内部字符的 codecvt 解码方案?
使用std::codecvt
'sin
方法将外部字节序列解码为内部字符序列时,是否存在内部字符的目标缓冲区需要空间容纳多个内部字符的情况?
这里有一些代码供参考:
这是我编写的一些模板代码的简化,用于解码从 Winsock 单独读取的字节SOCKET
,其中用户需要“无缓冲”输入。基本上,每次循环迭代时,都会将一个字节读入外部缓冲区。当in_res
is not时循环终止std::codecvt_base::partial
。
我想知道的是:是否存在调用in()
目标缓冲区中的多个内部字符需要空间的情况?即,是否存在使上述循环成为无限循环的场景?
c++ - 如何检查新 codecvt_byname 的构建是否成功
有没有标准的方法来检查一个新的建设是否std::codecvt_byname
成功?
我正在尝试以下程序:
std::runtime_error
如果指定的语言环境不受支持,Windows 上的 libstdc++ 显然会抛出一个对象。但是,Microsoft Visual C++ 的 STL 实现不会引发异常。
不知道哪个 C++ 编译器会编译代码,如何检查新的构造是否std::codecvt_byname
成功?或者,如果没有内存不足的情况,有没有办法检查构造是否会成功?
c++ - 特化 codecvt:当第三个模板参数不是 std::mbstate_t 时的链接器错误
给定
链接器随着消息而死
[vtable for std::codecvt]+0x50):未定义引用 'std::codecvt::do_max_length() const',对所有 codecvt do_* 成员重复,并且
[vtable for S]+0x20): 未定义引用 'std::codecvt::do_out(Q*&, char const*, char const*, char const*&, char*, char*, char*&) const' ,对所有 do_* 成员函数重复。
当 StateT 不是std::mbstate_t
时,编译工作还需要哪些专业化?
c++ - 使用 ICU 实现我自己的 codecvt facet
我想codecvt
使用 ICU 实现一个方面,以便在内部从任何字符编码(ICU 支持)转换为 UTF-8。我知道它codecvt_byname
存在并且它可以用来做我想要的一部分,如本例所示。该示例的问题在于它(1)使用宽字符流(我想使用“常规”、面向字节的流)和(2)需要 2 个流来执行转换。相反,我想要一个像这样的流:
因此,我想做这样的实现,但使用 ICU 而不是iconv
. 鉴于此,我的实现do_in()
是:
该our_state
对象维护两个UConverter*
指针,一个用于“外部”编码(在本例中为 ISO-8859-1),另一个用于 UTF-8 编码。
我的问题是:
- 我应该
nullptr
如上所述指定“枢轴”缓冲区,还是提供我自己的? - 我不确定何时(如果有的话)应该将
reset
参数(目前是false
上面的第一个)设置为true
. - 目前尚不清楚我如何知道何时将
flush
参数(当前是false
上面的第二个)设置为true
,即,我如何知道何时到达输入的末尾。
一点帮助?
c++ - 流、stream_bufs、codecvt facets 和 \n 到 \r\n 转换
C++ IO 流的哪一部分进行了\r
to\r\n
转换?它是它stream_buf
本身还是它是通过codecvt
方面的内部到外部编码转换的一部分?
更新 1
你们都说是在streambuf/filebuf中完成的。好的。但是这种安排如何处理,例如,像 UTF-16 这样的外部编码?然后似乎必须使用ios::binary
禁用翻译的标志打开文件。