- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经重载了 do_in
std::codecvt
的方法| :
#include <iostream>
#include <locale>
#include <string>
class codecvt_to_upper : public std::codecvt<char, char, std::mbstate_t> {
public:
explicit codecvt_to_upper(size_t r = 0) : std::codecvt<char, char,
std::mbstate_t>(r) {}
protected:
result do_in(state_type& state, const extern_type* from,
const extern_type* from_end, const extern_type*& from_next,
intern_type* to, intern_type* to_end, intern_type*& to_next)
const;
result
do_out(state_type& __state, const intern_type* __from,
const intern_type* __from_end, const intern_type*& __from_next,
extern_type* __to, extern_type* __to_end,
extern_type*& __to_next) const {
return codecvt_to_upper::ok;
}
result
do_unshift(state_type& __state, extern_type* __to,
extern_type* __to_end, extern_type*& __to_next) const {
return codecvt_to_upper::ok;
}
int
do_encoding() const throw () {
return 1;
}
bool
do_always_noconv() const throw () {
return false;
}
int
do_length(state_type&, const extern_type* __from,
const extern_type* __end, size_t __max) const {
return 1;
}
int
do_max_length() const throw () {
return 10;
}
};
codecvt_to_upper::result codecvt_to_upper::do_in(state_type& state,
const extern_type* from, const extern_type* from_end, const
extern_type*& from_next, intern_type* to, intern_type*
to_end, intern_type*& to_next) const {
codecvt_to_upper::result res = codecvt_to_upper::error;
const std::ctype<char>& ct = std::use_facet<std::ctype<char> >(
std::locale());
const extern_type* p = from;
while( p != from_end && to != to_end) {
*to++ = ct.toupper( *p++);
}
from_next = p;
to_next = to;
res = codecvt_to_upper::ok;
return res;
}
并以这种方式使用:
int main(int argc, char** argv) {
std::locale ulocale( std::locale(), new codecvt_to_upper);
std::cin.imbue( ulocale);
char ch;
while ( std::cin >> ch) {
std::cout << ch;
}
return 0;
}
但是do_in
未调用过载。我是否正确重载了它? std::codecvt<char, char, std::mbstate_t>
是哪个方法(以及如何)我必须改变才能使我的方面调用do_in
方法?
最佳答案
我认为首先应该解决的是 std::codecvt
family facet 仅被 std::basic_filebuf
使用因为只有在与外部设备打交道时才需要进行代码转换。在您的代码中,您将语言环境设置为 std::cin
,它有一个缓冲区不进行代码转换。
当然,仍然可以在程序中执行代码转换,但是阻止代码工作的方面是它继承自 std::codecvt<>
的特化。那不能做转换。 char => char
特化std::codecvt<>
没有定义转换,因此 do_in()
不会被调用,因为没有必要在两种类型之间进行转换。
我尝试运行您的代码,但将继承的方面更改为 std::codecvt<wchar_t, char, std::mbstate>
并使用宽字 rune 件流和it worked .
如果您希望它也适用于窄字符流,我建议创建一个流缓冲区,通过 underflow()
转发大写字符。 .
关于c++ - std::codecvt::do_in 方法重载与其余基本方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22688965/
此代码使用 Visual C++ 11 编译并在 Windows 7 上按预期运行,但使用 Windows 7 上的 MinGW 4.7.0 或 Linux 上的 gcc 4.8.0 编译失败。使用
在使用std::codecvt的in方法将外部字节序列解码为内部字符序列时,是否存在内部字符的目标缓冲区需要多个内部字符的空间? 这里有一些代码供引用: // const std::locale& l
我有一个 UTF-16 编码流,我想将它转换成纯 ASCII,即如果有一个 ASCII 字符 -> 打印它。如果代码单元代表其他我不关心的东西,例如汉字) -> 输出垃圾。 我正在使用这个代码 typ
有点前景:我的任务需要将 UTF-8 XML 文件转换为 UTF-16(当然还有适当的 header )。因此,我搜索了将 UTF-8 转换为 UTF-16 的常用方法,发现应该使用来自 的模板。
那么在 C++ codecvt/locale 库中是否有一个合适的方面可以用来测试一个字符是否"is"某物? IE 测试一个字符是否是任何形式的换行符,或代表数字或空格等? 或者是否必须为此手动/使用
我已经重载了 do_in std::codecvt的方法| : #include #include #include class codecvt_to_upper : public std::c
我想像这样使用 codecvt 将 std:wstring 转换为 std::string #include #include #include #include #include //so
一点前景:我的任务需要将 UTF-8 XML 文件转换为 UTF-16(当然,带有适当的 header )。因此,我搜索了将 UTF-8 转换为 UTF-16 的常用方法,发现应该使用 中的模板。
我正在尝试将我自己的 codecvt 与标准 iostream 一起使用。我正在使用这条线: std::cout.imbue(std::locale(std::locale("C"), new rot
从关于 locales 的问题延伸 并在 this question 中描述: 我真正想做的是在理解 UTF-16 文件的语言环境中安装一个 codecvt facet。 我可以自己写。但我不是 UT
如何编写 std::codecvt 方面?我想写从 UTF-16 到 UTF-8 的代码,从 UTF-16 到系统当前代码页(windows,所以 CP_ACP),以及系统的 OEM 代码页(wind
有点前景:我的任务需要将 UTF-8 XML 文件转换为 UTF-16(当然,带有正确的标题)。所以我搜索了将 UTF-8 转换为 UTF-16 的常用方法,发现应该使用 中的模板。 . 但现在是d
我正在研究我的一些旧的(并且专门面向 win32 的)东西并考虑使它更现代/可移植 - 即在 C++11 中重新实现一些可广泛重用的部分。这些部分之一是 utf8 和 utf16 之间的转换。在 Wi
我想使用 std::codecvt::in() 将以双字节代码页编码的字符串转换为 UTF-16 字符串关于 Microsoft 标准库实现 (MSVC11)。例如,考虑以下程序: #include
我什至无法从 cppreference.com 获得基本的 codecvt 示例以在 GCC 4.9 或 Clang 3.4 上编译,例如: http://goo.gl/HZ5GLH http://c
给定 #include struct Q; struct R{ void operator()(Q*) { } }; class S : public std::codecvt { } ; int
尝试使用 boost 文件系统 3,但是当我链接时,我得到以下 undefined reference : ../myfile-g.o: In function `boost::filesystem3
我将以下代码作为我正在编写的字符串类中的私有(private)函数(它是从 wstring_convert “借来的”,并由我进行了一些修改): template std::string my_st
有一个问题让我感到困惑。 std::codecvt 和 std::codecvt_utf8 之间的确切区别是什么?正如 STL 引用所说,std::codecvt_utf8 是来自 std::code
在 C++ 中,我想使用 Unicode 来做事。因此,在掉进 Unicode 的兔子洞之后,我最终陷入了困惑、头痛和语言环境的火车残骸中。 但在 Boost 中,我遇到了一个不幸的问题,即尝试使用
我是一名优秀的程序员,十分优秀!