LINUX.ORG.RU

История изменений

Исправление 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.