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 swprintf swfscanf vfscanwprintf vsfscanwprintf vsfscanwprint 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 ...*/
}
}
これを解決するにはどうすればよいですか? 標準ライブラリをいじるのは少し気が進まない。しかし、Apple が修正していなければ、GNU C ライブラリをコンパイルできるのではないでしょうか? または、ワイド文字 (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 を使用して、フィールド編集、表示からの文字の挿入および削除のために、何らかの文字列に含まれるコードポイントの数を知る必要があります。
ありがとう!