- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我仍然是 C 的新手,甚至对 C 中的宽字符更陌生。
下面的代码应该显示
蓝 Sprite 4分
但它显示
蓝 Sprite 4分
在 gdb 中,我看到这个:
(gdb) p buffer
$1 = L" 4 points to Smurfs",
但是当我从控制台复制粘贴时,空格神奇地消失了:
(gdb) p buffer
$1 = L"4 points to Smurfs",
此外,buffer[0]
根据 gdb
包含此内容:65279 L' '
显然,有问题的字符 是 Unicode 字符“零宽度不间断空间”(U+FEFF)。我重新输入了代码,确保我没有输入这个。我不知道这是从哪里来的。我还根据 https://stackoverflow.com/a/9691839/7602 在记事本中打开了代码那里没有多余的字符。
我不在乎 ncurses 是否会停止将其显示为空格。
代码(大幅缩减):
#include <time.h>
#include <stdio.h>
#include <errno.h>
#include <wchar.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <locale.h>
#define NCURSES_WIDECHAR 1
#include <ncursesw/ncurses.h>
#include "types.h"
#include "defines.h"
#include "externs.h"
WINDOW * term;
/*row column color n arguments */
void rccn(int row, int col, const wchar_t *fmt, ...)
{
wchar_t buffer[80];
int size;
va_list args;
va_start(args, fmt);
size = vswprintf(buffer, 80, fmt, args);
va_end( args );
if(size >= 80){
mvaddwstr(row, col, L"Possible hacker detected!");
}else{
mvaddwstr(row, col, buffer);
}
}
int main(void)
{
int ch;
setlocale(LC_ALL,"");
term = initscr();
rccn(1,1,L"%i points to %ls",4,L"Smurfs");
ch = getch();
return EXIT_SUCCESS;
}
问题随着rccn(1,1,L"%i 指向 %ls",4,L"Smurfs"+1);
好像常量的宽编码在前面添加了那个字符..
最佳答案
找到了..
我遵循了一个教程,其中建议添加这个编译器标志:-fwide-exec-charset=utf-32
我的代码根本没有在 Cygwin 上运行,我读到 Windows 是以 utf-16 为中心的,所以我删除了那个编译器标志,它开始在 Cygwin 上运行。
然后出于好奇,我删除了 Raspbian 上的编译器标志,现在它也可以正常工作,不再有字节顺序标记。
关于c - vswprintf 保持前缀字节顺序标记字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236550/
使用 10 月 2 日发布的 Symbian S60 第 5 版 SDK,我正在编译/运行(在 sim 上)以下代码片段: void test(wchar_t *dest, int size, con
我仍然是 C 的新手,甚至对 C 中的宽字符更陌生。 下面的代码应该显示 蓝 Sprite 4分 但它显示 蓝 Sprite 4分 在 gdb 中,我看到这个: (gdb) p buffer $1 =
有谁知道什么时候可以使用 vswprintf_l 而不是 vswprintf ? 谢谢 最佳答案 不同之处在于,vswprintf_l 在末尾添加一个 locale_t 类型的额外参数。这意味着您可以
我有以下示例程序,它使用预处理器定义一个简单的调试函数。 main.c #include #ifdef DEBUG #define __DEBUG 1 #else #define __DEBUG 0
我正在尝试使用 MinGW 在 Windows 上编译 Botan,但在编译期间收到以下错误: c:\qt\2010.04\mingw\bin\../lib/gcc/mingw32/4.4.0/inc
我有一个使用 _vscwprintf()/vswprintf() 的项目(通过 _vsctprintf()/_vstprintf()) 在 malloc()ed 缓冲区中创建任意长度的格式化字符串。
到目前为止,我已经在 visual studio 中编写了所有代码,现在我需要向其中添加一些 UI,因此我将使用 Qt。所以我在我的项目中添加了每个文件(主类除外),然后尝试使用 Qt 编译它。因为我
使用 Borland C++ Builder 2009 我根据 RAD Studio 的帮助 (F1) 使用 vswprintf : int vswprintf(wchar_t *buffer, co
为了提供更多细节,我正在使用 XCode 4.2 和 LLVM GCC 4.2.2 编译器使用 C 为 OS X 编写代码。 我有一个可变参数函数 - 为了完整起见,我包含了整个函数,尽管我/相信/其
我需要为格式函数 vswprintf() 分配足够的缓冲区。当用 ANSI 字符串做同样的事情时,我使用: vsnprintf( NULL, NULL, pszFormat, args ); 它返回我
我从 vswprintf 使用 GCC 和 Mac OS X(在 Mac OS X 10.6 和 10.8 下使用 gcc 4.0 和 4.2.1 测试。Linux 下的 GCC 是不受影响。Visu
我需要实现一个函数来格式化宽字符字符串并返回 std::wstring。我的实现是: std::wstring format(const wchar_t* fmt, ...) { std::w
我是一名优秀的程序员,十分优秀!