- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在尝试转换一些现有代码以支持 unicode 字符时,突然出现了这个问题。如果我尝试将 unicode 字符(在本例中使用欧元符号)传递给任何 *wprintf 函数,它将失败,但似乎只在 xcode 中。相同的代码在 visual studio 中运行良好,我什至能够让 friend 在 linux 上使用 gcc 成功测试它。这是有问题的代码:
wchar_t _teststring[10] = L"";
int _iRetVal = swprintf(_teststring, 10, L"A¥€");
wprintf(L"return: %d\n", _iRetVal);
// print values stored in string to check if anything got corrupted
for (int i=0; i<wcslen(_teststring); ++i) {
wprintf(L"%d: (%d)\n", i, _teststring[i]);
}
在 xcode 中,对 swprintf 的调用将返回 -1,而在 visual studio 中,它将成功并继续为 3 个字符(65、165、8364)中的每一个打印出正确的值。
我在谷歌上搜索了很长时间并努力寻找解决方案,出现过多次的一个建议是使用如下调用:
setlocale(LC_CTYPE, "UTF-8");
我已尝试使用此函数的各种参数组合但没有成功,经过进一步调查,如果我尝试将语言环境设置为默认“C”以外的任何值,它似乎会返回 null。
我不知道我还能尝试什么来解决这个问题,而且它在其他编译器/平台上工作的事实只会让这一切变得更加令人沮丧。任何帮助将不胜感激!
编辑:只是想我会补充一点,当 swprintf 调用失败时,它会设置一个错误代码 (92),其定义为:
#define EILSEQ 92 /* Illegal byte sequence */
最佳答案
如果您从环境中获取语言环境,它应该可以工作:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void) {
setlocale(LC_ALL, "");
wchar_t _teststring[10] = L"";
int _iRetVal = swprintf(_teststring, 10, L"A¥€");
wprintf(L"return: %d\n", _iRetVal);
// print values stored in string to check if anything got corrupted
for (int i=0; i<wcslen(_teststring); ++i) {
wprintf(L"%d: (%d)\n", i, _teststring[i]);
}
}
在我的 OS X 10.6 上,这在 GCC 4.2.1 中按预期工作,但在使用 CLang 1.6 编译时,它会将 UTF-8 字节放入结果字符串中。
我也可以用 Xcode 编译它(使用标准的 C++ 控制台应用程序模板),但是因为 OS X 上的图形应用程序没有所需的语言环境变量,它在 Xcode 的控制台中不起作用。另一方面,它始终在终端应用程序中运行。
您还可以将语言环境设置为 en_US.UTF-8
(setlocale(LC_ALL, "en_US.UTF-8")
),但这是不可移植的.根据您的目标,wsprintf
可能有更好的替代方案。
关于c++ - swprintf 在 xcode 中使用 unicode 字符失败,但在 visual studio 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4885094/
我正在尝试使用 RtlStringCbPrintfW (swprintf 的安全版本),并在将 int 附加到字符串时得到意外结果。 如果我在 int 之后附加相同的字符串 - 一切正常。所以我的代码
求助!我对 C 语言一无所知,但我必须对 C 代码做一点补充。 我从 GetLastError 得到一个错误号 (int) 并将它显示到一个表单中。相反,我需要获取实际的错误字符串。 我添加了对 Fo
以下代码行在 Visual Studio 2010 中产生垃圾: swprintf(buf, L"Value is %s", "abcd"); 但是,相同的代码在 Linux 上运行良好。 通过试用,
我在 Windows 上使用 MinGW g++ 编译器(gcc 版本 4.8.1),我对 swprintf 声明感到困惑 根据 this reference应该是 int swprintf (wch
我正在修复在 linux 和 windows 上运行的遗留代码,在某些情况下,本应包含格式化内容的缓冲区小于该内容。 代码使用根据 documentation 的 swprintf size - up
我正在尝试从 javascript 执行此操作 swprintf(hexResult, L"%I64X", result);,这可能吗?这样 CityHash64('C:\Program Files
还有人遇到过这样的问题吗? swprintf_s(v, len, L"%ws", var); MessageBox(NULL, v, NULL' NULL); 消息框打印出“%ws”而不是var的内容
在调用swprintf 将char 转换为wchar 后,调用循环会触发段错误;循环 header 中的语句在循环上下文之外工作正常。 swprintf 命令基于返回值 (3, which is th
这发生在 OS X 上,但我怀疑它适用于任何 UNIX-y 操作系统。我有两个如下所示的字符串: const wchar_t *test1 = (const wchar_t *)"\x44\x00\x
我正在尝试使用 MinGW 在 Windows 上编译 Botan,但在编译期间收到以下错误: c:\qt\2010.04\mingw\bin\../lib/gcc/mingw32/4.4.0/inc
我尝试使用 swprintf(buff, 4, L"%#03x", value),但是当 value = 0 时,我得到 000 而不是 0x0。 最佳答案 您需要字面值中的“0x”,例如“0x%03
大部分时间我在 Android 上使用 UTF-8,但我最近也在测试 wchar_t。我知道 wchar_t 在早期很糟糕,但我不关心太旧的设备,所以认为现在使用 wchar_t 会很好。 测试于:
以下代码行与 Visual Studio 2013 一起运行: wchar_t test[] = L"\xffff"; wchar_t buf[100]; int ret = swprintf(
到目前为止,我已经在 visual studio 中编写了所有代码,现在我需要向其中添加一些 UI,因此我将使用 Qt。所以我在我的项目中添加了每个文件(主类除外),然后尝试使用 Qt 编译它。因为我
wide char printf 单个字符发生了什么? VS10 和 MCBS: #include #include int const maxPathFolder = MAX_PATH - 3;
我正在尝试将 char* 字符串转换为 wchar_t*。我看到这个问题已经被问了很多次,但没有解决/可移植的答案/解决方案。 按照建议here , swprintf 对我来说似乎是正确的解决方案,但
以下几行都“按预期工作”: wchar_t u[50], v[50]; swprintf(u, 50, L"%s", L"hello"); swprintf(v, 50, L"%ls", L"good
我正在编写一个 Excel 插件,需要生成 wchar_tExcel 的输出(尽管在内部,我们是 100% char,并且实际上将 char 限制为纯 ASCII)。有一次,我正在使用swprintf
我有一个多平台项目,它在 mac 上编译得很好,但是在 Windows 上,我所有带有 %s 的 swprintf 调用都在寻找 wchar_t 而不是 char * 我通过它。结果 M$ 认为在宽字
在尝试转换一些现有代码以支持 unicode 字符时,突然出现了这个问题。如果我尝试将 unicode 字符(在本例中使用欧元符号)传递给任何 *wprintf 函数,它将失败,但似乎只在 xcode
我是一名优秀的程序员,十分优秀!