在 Mac Os X 10.6.8 上,在解决此问题之前,我无法使用标准库中的 wchar_t 函数编译代码。
wcscoll 函数以及其他一些函数:
inttypes.h :#pragma GCC 毒 wcstoimax wcstoumax stdlib.h :#pragma GCC 毒 mbstowcs mbtowc wcstombs wctomb wchar.h :#pragma GCC 毒 fgetws fputwc fputws fwprintf fwscanf mbrtowc mbsnrtowcs >mbsrtowcs putwc putwchar swprintfscanf >swvwf vsvprintfscanf vprint wcrtomb wcscat wcschr wcscmp wcscoll wcscpy wcscspn wcsftime wcsftime wcslcat >wcslcpy wcslen wcsncat wcsncmp wcsncpy wcsnrtombs wcspbrk wcsrchr wcsrtombs wcsspn wcsstr >wcstod wcstof wcstok wcstol wcstold wcstoll wcstoul wcstoull wcswidth wcsxfrm wcwidth >wmemchr wmemcmp wmemcpy wmemmove wmemset wprintf wscanf
#include <stdio.h>
#include <wchar.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
extern int errno;
int main(void)
{
wchar_t pwcs1[3]={L"ØL"}, pwcs2[3]={L"Ål"};
size_t n;
(void)setlocale(LC_ALL, "");
/* set it to zero for checking errors on wcscoll */
errno = 0;
/*
** Let pwcs1 and pwcs2 be two wide character strings to
** compare.
*/
/* n = wcscmp(pwcs1, pwcs2); */
n = wcscoll(pwcs1, pwcs2);
/*
** If errno is set then it indicates some
** collation error.
*/
if (n < 0 ) {
printf("%s\n","Øl mindre en Ål" );
} else if (n == 0) {
printf("%s\n","Øl lik Ål" );
} else {
printf("%s\n","Øl større en Ål" );
}
if(errno != 0){
/* error has occurred... handle error ...*/
}
}
我该如何解决这个问题?我有点不愿意弄乱标准库。但我想我也许可以编译 GNU C 库,如果 Apple 没有修复它?或者在处理宽字符(Utf-8)的库中是否有任何其他合适的替代方案。
我正在移植一些古老的东西,所以我真的需要使用 ncurses,为了使用 ncurses,我需要宽字符!:)
编辑:据我所知,标准的包含路径应该是 /usr/include。我已经浏览了我拥有的 SDK 的包含目录,并且通过头文件的 grep 显示了相同的毒编译指示,来自http://opensource.apple.com/tarballs/Libc/的最新 tarball 也是如此
编辑++
事后看来,这些编译指示的存在是有原因的,我一直在寻找替代方案,所以现在,我正在尝试构建刚刚下载的 glibc,并且我检查了没有任何“GCC 毒”编译指示的标头。
在 glibc 的配置文件中阅读了一下,我想这不是一个简单的选择。我想我必须剖析一些适用于 utf-8 并在 mac osX 上使用 ncurses 的东西来弄清楚如何。
可能是我忽略了一个简单的解决方案。但是 ncurses 依赖于 7 位 ascii,这是我的问题。我的目标是在使用 ncurses 时呈现 utf-8 语言特定的字符。我需要能够排序,因为格式是带有索引的“专有”,分叉出系统调用来排序记录是没有选择的。我还需要能够知道某种字符串中有多少个代码点,用于使用 ncurses 从显示器中进行字段编辑、插入和删除字符。
谢谢!