问题标签 [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++ - 使用 C++ 输入的 Unicode 字符的索引和直方图
计算每个符号的出现次数以及它们在文本、单词或行中出现的位置 我有一个类似许多语言的单词列表。
我正在尝试做的是计算每个字符的出现次数以及它们在文本中的位置或常见位置。如果有可能计算音节的常见数量也会有帮助。
这是当前的代码 sehe 使它与 unicode 一起使用
这是我的原始代码
我试图得到的例子
找到的字母 K 然后找到它的出现次数 10 然后在每个单词中找到它的位置,如前所述。
c++ - std::use_facet::out() 中可能存在缓冲区溢出错误
我想我在 VC++10 std::locale 对象中发现了一个缓冲区溢出错误。对于我是否做错了什么,我将不胜感激。
下面的代码被简化以演示问题。我正在尝试将 wchar_t (UTF-16) 字符转换为 (Windows) ANSI 代码页 51949(又名 EUC-KR)。选择代码页是因为它使用双字节 (DBCS) 编码。
我故意为双字节结果提供单个字符缓冲区,期望它以“部分”或“错误”状态失败。
相反,它返回状态“ok”,写入缓冲区末尾并在尝试退出时导致损坏堆栈异常。
使用调试器进入 facet.out(),我发现自己(下降了几个级别)在以下函数中:
问题似乎是这样的:
在线上if ((int)MB_CUR_MAX <= _Last2 - _Mid2)
,MB_CURR_MAX(#defined 到函数 ___mb_cur_max_func(),返回“1”,而不是 DBCS 字符预期的“2”。
此函数似乎正在访问全局语言环境,而不是在初始化方面时提供的语言环境。
如果我将全局语言环境设置如下:
一切正常(并以“部分”状态失败)。
因此,在我看来,这个特定的实现out()
错误地使用全局语言环境来确定 MB_CUR_MAX,而不是在对象构造时提供的语言环境——从而导致缓冲区溢出错误。
有人能指出我在这方面的错误吗?
------------------------------
2013 年 5 月 20 日更新
---------------- --------------
我已将此作为错误 787227 报告给 MS。
------------------------------
2015 年 7 月 27 日更新
---------------- --------------
我收到一封来自 Microsoft 的电子邮件,说此错误已在 Visual Studio 2015 的新 RTM 中修复。(耶)
utf-8 - 在 C++11 中读取/写入/打印 UTF-8
我一直在探索 C++11 的新 Unicode 功能,虽然其他 C++11 编码问题非常有帮助,但我对cppreference中的以下代码片段有疑问 。代码写入然后立即读取以 UTF-8 编码保存的文本文件。
我的问题很简单,为什么循环wchar_t
中需要a ?可以使用简单的方式声明字符串文字for
,并且 UTF-8 编码的位布局应该告诉系统字符的宽度。似乎有一些从 UTF-8 到 UTF-32 的自动转换(因此是),但如果是这种情况,为什么需要进行转换?u8
char *
wchar_t
c++ - 码点中的 fstream 文件大小
获取 std::fstream 文件的文件大小有很多问题,但它们都以字节为单位返回文件大小,并且如果文件在另一个流中打开,则容易出错。
我想知道代码点中的文件大小,而不是字节。
现在std::fstream::seekg(0,std::ios::end)
后面std::fstream::tellg()
只返回字节长度。这并没有告诉我文件中有多少 UTF-16/32 字符。将结果除以sizeof(wchar_t)
我听到你说的。不适用于 UTF-8 文件且不可移植。
现在,对于更有技术意识的人,我有imbued
自己的std::codecvt
班级。std::codecvt
有一个成员length()
,给定两个指向流的指针,计算长度并返回最大或输出字符数。我原以为在文件上搜索会按基本类型codecvt::intern_type
而不是按基本char
类型搜索。
我查看了fstream
标题,发现 seek 事实上不使用codecvt
. 而且,在我的 VS2010 版本中,codecvt::length()
甚至没有提到该成员。事实上,在每次调用时,都会创建一个新的字符串对象,每次返回时都会codecvt::in()
增加 1 个字符。相反,它不会调用成员并为调用提供足够的缓冲区。in()
partial
codecvt::max_length()
这只是我的实现还是我可以期望其他人也这样做?是否std::fstream
已针对 VS2012 重写以充分利用语言环境?
基本上,我厌倦了每次使用文本文件时都必须编写自己的文件处理程序。我希望创建一个fstream
派生类,该类将首先读取文件 BOM(如果存在)并灌输正确的codecvt
. 然后将这些字符转换为char
,wchar_t
或代码要求的任何字符。我还希望以这样一种方式对其进行编码,即如果已知编码的先验知识,则locale
可以在构造时指定 a 。
直接在内部缓冲区上工作会更好,影响重写 fstream 类还是有一些我不知道的技巧?
unicode - 使用 std::fstream 写入 UTF16 文件
是否可以注入 std::fstream 以便包含 UTF-8 编码的 std::string 可以流式传输到 UTF-16 文件?
我使用 utf8-to-utf16 方面尝试了以下操作,但结果文件仍然是 UTF-8:
对 codecvt_utf8_utf16 方面的引用似乎表明它可用于读取和写入 UTF-8 文件,而不是 UTF-16 - 这是正确的,如果是这样,是否有一种简单的方法来做我想做的事情?
c++ - std::codecvt::unshift() 可能需要的最大输出大小是多少?
我正在处理一个自定义文件streambuf
。现在,我想像这样在寻找时刷新fstream
。此时我想知道输出的数组std::codecvt::unshift()
应该有多大?在我看来,返回的大小std::codecvt::max_length()
应该足够了。我的假设对吗?
c++ - std::codecvt_utf8 方面的问题
这是使用std::codecvt_utf8<>
facet 转换wchar_t
为 UTF-8 的代码片段。使用 Visual Studio 2012,我的期望没有得到满足(请参阅代码末尾的条件)。我的期望错了吗?为什么?或者这是 Visual Studio 2012 库问题?
这里的期望是该out()
函数一次输出一个字节的 UTF-8 转换,但上述if
条件的中间在 Visual Studio 2012 中为 false。
更新
失败的是out_mid == out_end
和state != 0
条件。基本上,我希望至少产生一个字节,并将必要的状态存储在state
变量中,以使 UTF-8 序列的下一个字节可产生。
c++ - 带有 CR LF 转换的 C++ iostream UTF-16 文件 I/O
我想读取和写入使用 CR LF 行分隔符 (L"\r\n") 的 utf-16 文件。使用 C++ (Microsoft Visual Studio 2010) iostreams。我希望将写入流的每个 L"\n" 透明地转换为 L"\r\n" 。使用 codecvt_utf16 语言环境方面需要以 ios::binary 模式打开 fstream,从而失去通常的文本模式 \n 到 \r\n 的翻译。
我想要一个不需要像 BOOST 这样的额外库的解决方案。
c++ - boost::program_option::store 在选项字符串包含混合语言字符时抛出异常
我有一个简单的代码,可以很好地与输入选项一起使用,它只包含 ASCII 字符,但是会抛出一个异常,错误消息是“错误:字符转换失败”。有解决办法吗?
背景资料:
这是源代码:
我已经进入了boost代码,发现这个函数抛出了异常(boost_1_53_0\libs\program_options\src\convert.cpp):
当我进入boost代码时,我发现这个语句
实际上工作正常,是 boost::program_options::store() 函数无法将 utf-8 中的字符串转换回 wstring。此失败的原因可能是我当前的代码页不支持非 ASCII 字符。如果我当前的语言环境是基于中文的,我想我的代码会很好用。我的问题有什么解决办法吗?提前谢谢了。
c++ - std::codecvt::do_in 方法重载与其他基本方法
我重载do_in
了以下方法std::codecvt
:
并以这种方式使用:
但do_in
没有调用重载。我是否正确地超载了它?我必须更改哪种方法std::codecvt<char, char, std::mbstate_t>
(以及如何)才能使我的构面调用do_in
方法?