我得到 argv 作为 wchar_t** (见下文),因为我需要使用 unicode,但我需要将其转换为 char **。我怎样才能做到这一点?
int wmain(int argc, wchar_t** argv)
{
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一些只有用户可以移植的C代码gcc,并且已glib安装.
从我的所有研究中,我发现gcca,a wchar_t总是定义为4个字节,gliba gunichar也是4个字节.
我没想到的是,如果像a gunichar,a wchar_t也被编码为UCS4.是这样的吗?如果是这样,我应该能够简单地转换gunichar*为a wchar_t*并使用这些stdc wcs*函数,对吗?
我已成功将我的游戏移植到Cocos2d-x,它在Linux,QNX,iOS和Mac上运行良好.我还设置了Android NDK,并且能够在Android上成功构建和运行应用程序(所有来自完全相同的来源,这真的很整洁!)
然而在Android上有一件奇怪的事情发生了:我正在使用的SimpleJSON.cpp类无法解析正确格式化的JSON字符串.我使用这个框架:https://github.com/MJPA/SimpleJSON
我已经查看了代码,但我不是一个CPP专家,看看它有什么问题(如果有的话)(它适用于除Android之外的所有平台,它编译得很好).
我确实注意到Class非常广泛地使用了wchar_t,我也明白这可能是Android上的一个问题.
无论如何,我一直在弄清楚如何让这个东西在过去48小时内起作用,但我失败了.有没有人可以指出我正确的方向?
是否有我忘记设置的编译器选项?这个课程不适用于Android吗?如何更改类以使其在Android上正常运行?
欢迎提供所有提示.
RGDS.
wchar_t*在Linux 上存储使用UTF-16编码的文本是否有意义?显而易见的问题是wchar_tLinux上有四个字节,UTF-16通常每个字符需要两个(有时是两组)两个字节.
我正在尝试使用完全相同的第三方库,这似乎非常令人困惑.看起来事情搞砸了,因为在Windows上wchar_t是两个字节,但我只是想仔细检查,因为它是一个非常昂贵的商业库,可能我只是不明白的东西.
我知道这个问题在这里已经被问过很多次了,我确实阅读了一些答案,但是有一些建议的解决方案,我试图找出其中最好的解决方案。
我正在编写一个 C99 应用程序,它基本上接收以 UTF-8 编码的 XML 文本。
它的部分工作是复制和操作该字符串(查找 substr,cat it,例如..)
因为我现在不想使用外部的非标准库,所以我尝试使用 wchar_t 来实现它。
目前,我使用 mbstowcs 将其转换为 wchar_t 以便于操作,对于一些我尝试使用不同语言的输入 - 它工作正常。
事实是,我确实读过一些人对 UTF-8 和 mbstowcs 有一些问题,所以我想知道这种使用是否被允许/可接受。
我面临的另一个选择是使用带有 WCHAR_T 参数的 iconv。事实是,我在一个平台(而不是 PC)上工作,它的语言环境非常仅限于 ANSI C 语言环境。那个怎么样?
我也遇到过一些非常流行的 C++ 库。但我仅限于 C99 实现。
此外,我将在另一个平台上编译此代码,wchar_t 的 sizeof 是不同的(在我的机器上是 2 个字节与 4 个字节)。我怎样才能克服它?使用固定大小的字符容器?但是,我应该使用哪些操作函数呢?
很高兴听到一些想法。谢谢。
在Microsoft VC2005和g ++编译器中,以下结果都会导致错误:
在win32 VC2005上:sizeof(wchar_t)是2
wchar_t *foo = 0;
static_cast<unsigned short *>(foo);
Run Code Online (Sandbox Code Playgroud)
结果是
error C2440: 'static_cast' : cannot convert from 'wchar_t *' to 'unsigned short *' ...
Run Code Online (Sandbox Code Playgroud)
在Mac OS X或Linux上g ++:sizeof(wchar_t)为4
wchar_t *foo = 0;
static_cast<unsigned int *>(foo);
Run Code Online (Sandbox Code Playgroud)
结果是
error: invalid static_cast from type 'wchar_t*' to type 'unsigned int*'
Run Code Online (Sandbox Code Playgroud)
当然,我总是可以使用reinterpret_cast.但是,我想了解为什么编译器认为static_cast到适当的整数类型是非法的.我确信有充分的理由......
我在使用基于模板的文件读取程序时遇到问题,例如:
bool parse(basic_ifstream<T> &file)
{
T ch;
locale loc = file.getloc();
basic_string<T> buf;
file.unsetf(ios_base::skipws);
if (file.is_open())
{
while (file >> ch)
{
if(isalnum(ch, loc))
{
buf += ch;
}
else if(!buf.empty())
{
addWord(buf);
buf.clear();
}
}
if(!buf.empty())
{
addWord(buf);
}
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这将在我实例化这个类时有效<char>,但在我使用时<wchar_t>(显然)有问题.
课外,我正在使用:
for (iter = mp.begin(); iter != mp.end(); ++iter )
{
cout << iter->first << setw(textwidth - iter->first.length() + 1);
cout << " " << iter->second << endl;
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试wchar_t*使用intas作为参数进行格式化.我谷歌搜索了很多,但我只是更加困惑.所以,请考虑以下代码:
int main(int argc, char** argv) {
wchar_t buf[16];
wsprintf(buf, L"%d", 5);
wprintf(L"[%ls]\n", buf);
system("pause");
return 0;
};
Run Code Online (Sandbox Code Playgroud)
假设wchar_t,wsprintf并且wprintf是广泛的字符等价物char,sprintf并且printf我预期上面打印[5],但它打印[和之间的垃圾].达到预期结果的正确方法是什么?我在这里误解了什么?
(我应该澄清一下,可移植性比安全性更重要,所以我想知道一个使用这一系列功能而不是更安全的特定于供应商的扩展的解决方案.)
从:
man strchr
Run Code Online (Sandbox Code Playgroud)
char*strchr(const char*s,int c);
strchr()函数返回指向字符串s中第一次出现的字符c的指针.
这里"字符"表示"字节"; 这些函数不适用于宽字符或多字节字符.
如果我尝试搜索多字节字符é(0xC3A9在UTF-8中):
const char str[] = "This string contains é which is a multi-byte character";
char * pos = strchr(str, (int)'é');
printf("%s\n", pos);
printf("0x%X 0x%X\n", pos[-1], pos[0]);
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
这是一个多字节字符
0xFFFFFFC3 0xFFFFFFA9
尽管有警告:
警告:多字符字符常量[-Wmultichar]
所以这是我的问题:
strchr用于多字节字符?(它似乎工作,只要int类型足够大,包含你的多字节,最多4个字节)0xFFFFFF?char的签名不是标准化的.因此有signed char和unsigned char类型.因此,使用单个字符的函数必须使用可以包含signed char和unsigned char的参数类型(此类型被选择为int),因为如果参数类型是char,我们将从编译器获取类型转换警告(如果-Wconversion在这样的代码中使用):
char c = 'ÿ';
if (islower((unsigned char) c)) ...
warning: conversion to ‘char’ from ‘unsigned char’ may change the sign of the result
Run Code Online (Sandbox Code Playgroud)
(这里我们考虑如果islower()的参数类型为char会发生什么)
而没有明确的类型转换使其工作的事情是自动升级char到int.
此外,wchar_t引入的ISO C90标准没有说明任何具体的表示wchar_t.
glibc引用的一些引用:
定义
wchar_t为合法是合理的char
如果
wchar_t定义为必须定义char类型wint_t,则int由于参数提升.
因此,wchar_t可以很好地定义为char,这意味着必须应用宽字符类型的类似规则,即,可能存在wchar_t积极的实现
,并且可能存在wchar_t否定的实现.由此可以得出必须存在unsigned wchar_t和signed wchar_t类型(出于同样的原因,因为有 …