История изменений
Исправление
kirk_johnson,
(текущая версия)
:
Издание номер два, поправленное и дополненное:
$ cat test-stream.c
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
int main(void)
{
const wchar_t string[] = L"пенис\n";
setlocale(LC_ALL, "");
fputws(string, stdout);
return 0;
}
$ cat test-write.c
#include <locale.h>
#include <unistd.h>
#include <wchar.h>
int main(void)
{
const wchar_t string[] = L"пенис\n";
setlocale(LC_ALL, "");
write(1, string, sizeof(string) - sizeof(wchar_t));
return 0;
}
$ echo пенис | iconv -t utf-32 > data.iconv
$ echo пенис | iconv -t utf-32be > data.iconv-be
$ echo пенис | iconv -t utf-32le > data.iconv-le
$ ./test-stream > data.stream
$ ./text-write > data.write
$ file data.*
data.iconv: Unicode text, UTF-32, little-endian
data.iconv-be: data
data.iconv-le: data
data.stream: UTF-8 Unicode text
data.write: data
$ hexdump -C data.iconv
00000000 ff fe 00 00 3f 04 00 00 35 04 00 00 3d 04 00 00 |....?...5...=...|
00000010 38 04 00 00 41 04 00 00 0a 00 00 00 |8...A.......|
0000001c
$ hexdump -C data.iconv-be
00000000 00 00 04 3f 00 00 04 35 00 00 04 3d 00 00 04 38 |...?...5...=...8|
00000010 00 00 04 41 00 00 00 0a |...A....|
00000018
$ hexdump -C data.iconv-le
00000000 3f 04 00 00 35 04 00 00 3d 04 00 00 38 04 00 00 |?...5...=...8...|
00000010 41 04 00 00 0a 00 00 00 |A.......|
00000018
$ hexdump -C data.stream
00000000 d0 bf d0 b5 d0 bd d0 b8 d1 81 0a |...........|
0000000b
$ hexdump -C data.write
00000000 3f 04 00 00 35 04 00 00 3d 04 00 00 38 04 00 00 |?...5...=...8...|
00000010 41 04 00 00 0a 00 00 00 |A.......|
00000018
Отсюда видно, что у тебя после write() должен получиться utf32le. Если посмотришь, iconv -t utf32 от iconv -t utf32le отличается наличием BOM.
P.S. VIM нормально распознает текст в data.iconv, но не может распознать его в data.iconv-[bl]e.
Исправление
kirk_johnson,
:
Издание номер два, поправленное и дополненное:
$ cat test-stream.c
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
int main(void)
{
const wchar_t string[] = L"пенис\n";
setlocale(LC_ALL, "");
fputws(string, stdout);
return 0;
}
$ cat test-write.c
#include <locale.h>
#include <unistd.h>
#include <wchar.h>
int main(void)
{
const wchar_t string[] = L"пенис\n";
setlocale(LC_ALL, "");
write(1, string, sizeof(string) - sizeof(wchar_t));
return 0;
}
$ echo пенис | iconv -t utf-32 > data.iconv
$ echo пенис | iconv -t utf-32be > data.iconv-be
$ echo пенис | iconv -t utf-32le > data.iconv-le
$ ./test-stream > data.stream
$ ./text-write > data.write
$ file data.*
data.iconv: Unicode text, UTF-32, little-endian
data.iconv-be: data
data.iconv-le: data
data.stream: UTF-8 Unicode text
data.write: data
$ hexdump -C data.iconv
00000000 ff fe 00 00 3f 04 00 00 35 04 00 00 3d 04 00 00 |....?...5...=...|
00000010 38 04 00 00 41 04 00 00 0a 00 00 00 |8...A.......|
0000001c
$ hexdump -C data.iconv-be
00000000 00 00 04 3f 00 00 04 35 00 00 04 3d 00 00 04 38 |...?...5...=...8|
00000010 00 00 04 41 00 00 00 0a |...A....|
00000018
$ hexdump -C data.iconv-le
00000000 3f 04 00 00 35 04 00 00 3d 04 00 00 38 04 00 00 |?...5...=...8...|
00000010 41 04 00 00 0a 00 00 00 |A.......|
00000018
$ hexdump -C data.stream
00000000 d0 bf d0 b5 d0 bd d0 b8 d1 81 0a |...........|
0000000b
$ hexdump -C data.write
00000000 3f 04 00 00 35 04 00 00 3d 04 00 00 38 04 00 00 |?...5...=...8...|
00000010 41 04 00 00 0a 00 00 00 |A.......|
00000018
Отсюда видно, что у тебя после write() должен получиться utf32le. Если посмотришь, iconv -t utf32 от iconv -t utf32le отличается наличием BOM. При этом, vim нормально распознает текст в data.iconv, но не может распознать его в data.iconv-[bl]e.
Исходная версия
kirk_johnson,
:
Издание номер два, поправленное и дополненное:
$ cat test-stream.c
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
int main(void)
{
const wchar_t string[] = L"пенис\n";
setlocale(LC_ALL, "");
fputws(string, stdout);
return 0;
}
$ cat test-write.c
#include <locale.h>
#include <unistd.h>
#include <wchar.h>
int main(void)
{
const wchar_t string[] = L"пенис\n";
setlocale(LC_ALL, "");
write(1, string, sizeof(string) - sizeof(wchar_t));
return 0;
}
$ echo пенис | iconv -t utf-32 > data.iconv
$ echo пенис | iconv -t utf-32be > data.iconv-be
$ echo пенис | iconv -t utf-32le > data.iconv-le
$ ./test-stream > data.stream
$ ./text-write > data.write
$ file data.*
data.iconv: Unicode text, UTF-32, little-endian
data.iconv-be: data
data.iconv-le: data
data.stream: UTF-8 Unicode text
data.write: data
$ hexdump -C data.iconv
00000000 ff fe 00 00 3f 04 00 00 35 04 00 00 3d 04 00 00 |....?...5...=...|
00000010 38 04 00 00 41 04 00 00 0a 00 00 00 |8...A.......|
0000001c
$ hexdump -C data.iconv-be
00000000 00 00 04 3f 00 00 04 35 00 00 04 3d 00 00 04 38 |...?...5...=...8|
00000010 00 00 04 41 00 00 00 0a |...A....|
00000018
$ hexdump -C data.iconv-le
00000000 3f 04 00 00 35 04 00 00 3d 04 00 00 38 04 00 00 |?...5...=...8...|
00000010 41 04 00 00 0a 00 00 00 |A.......|
00000018
$ hexdump -C data.stream
00000000 d0 bf d0 b5 d0 bd d0 b8 d1 81 0a |...........|
0000000b
$ hexdump -C data.write
00000000 3f 04 00 00 35 04 00 00 3d 04 00 00 38 04 00 00 |?...5...=...8...|
00000010 41 04 00 00 0a 00 00 00 |A.......|
00000018
Отсюда видно, что у тебя после write() должен получиться utf32le. Если посмотришь, iconv -t utf32 от iconv -t utf32le отличается наличием BOM.