C fwprintf将回车置于换行之前
我的WinAPI程序的目标是从文件中提取文本并将其保存到文件中 在文本模式下创建文件时,将换行符C fwprintf将回车置于换行之前,c,winapi,file-io,utf-8,carriage-return,C,Winapi,File Io,Utf 8,Carriage Return,我的WinAPI程序的目标是从文件中提取文本并将其保存到文件中 在文本模式下创建文件时,将换行符LF前面加上回车符CR HWND hEdit = CreateWindowA( "Edit", NULL, WS_CHILD|ES_MULTILINE, 0, 0, 100, 100, hWnd, (HMENU)ID_EDITORE, GetModuleHandle(NULL), NULL ); // Input in Edit control
LF
前面加上回车符CR
HWND hEdit = CreateWindowA( "Edit", NULL, WS_CHILD|ES_MULTILINE, 0, 0, 100, 100,
hWnd, (HMENU)ID_EDITORE, GetModuleHandle(NULL), NULL );
// Input in Edit control a single line break "\r\n"
int num = GetWindowTextLength(hEdit);
char buffer[num+1];
GetWindowText( hEdit, buffer, num+1 );
FILE* file = fopen( "test.txt", "w" );
fprintf( file, "%s", buffer );
上述代码不在文件中写入CR
LF
,但:
CR
CRLF
(0D 0D 0A)
我知道在ANSI版本中,解决方案是以二进制模式打开文件:“wb”
而不是“w”
,这样在输出过程中就不会发生CR
LF
翻译或字符转换
但我想在编辑控件中输入Unicode字符,并用BOM对文件进行UTF-8编码。那么宽字符版本和宽字符版本呢 上述代码不在文件中写入
i
>
?
CR
LF
,但:
i
CR
CR
LF
(EF BB BF 0D 0D 0A)
这里无法使用“b”
二进制模式来避免CR
添加
FILE* file = _wfopen( L"test.txt", L"wb,ccs=UTF-8" );
在文件中写入预期的\r\n
,但编码为UTF-16,没有任何BOM表:
CR
NUL
LF
NUL
(0D 00 0A 00)
如何避免UTF-8文件的这种扩散
我是被迫将其编码为UTF-16吗
感谢您的建议。正如建议的那样,一个可能的解决方案是在将
缓冲区
写入文件之前删除所有CR
s。然后,
fwprintf
会在每个LF
之前放置一个CR
,以还原对\r\n
HWND hEdit = CreateWindowW( L"Edit", ... );
int num = GetWindowTextLength(hEdit);
wchar_t buffer[num+1];
GetWindowTextW( hEdit, buffer, num+1 );
for( int i=0, id=0; id<=num; i++, id++ ) {
while( buffer[id]=='\r' )
id++;
buffer[i] = buffer[id];
}
FILE* file = fopen( "test.txt", "w,ccs=UTF-8" );
fwprintf( file, L"%s", buffer );
fclose(file);
HWND hEdit=CreateWindowW(L“编辑”,…);
int num=GetWindowTextLength(hEdit);
wchar_t缓冲区[num+1];
GetWindowTextW(hEdit,buffer,num+1);
对于(inti=0,id=0;idI真的认为i/O函数的宽字符版本对UTF-8一无所知。这不是一种“宽”编码,而是一种可变宽度编码。是否使用“b”
和“\r”
取决于未声明的编码目标:即使代码在不同平台上编译,您是否希望打印完全相同的文件(使用“b”
和所选的“\r\n”
或“\n”
)?还是希望行结尾是编译器本机生成的。(不要使用“b”
和“\r”
)。您希望跨平台执行什么操作?这实际上是一个编译器部分,而不是一个操作系统选项。@unwind:\wfopen
和fwprintf
完美地管理UTF-8,这要归功于标记“ccs=UTF-8”
他们添加了ï»
BOM表,并对宽字符输入进行所有字符转换。唯一的错误是。@chux:我正在编写一个Windows程序。如果我使用“b”
输出将不是UTF-8。我不能选择行结尾,它是\r\n
,因为流来自。简单的事实是,Windows上的标准文本行结尾是\r\n
,并且是从CP/M开始的,C标准库就是为了反映这一点而编写的,处理任何其他内容的程序都有逻辑来做如此内在。
HWND hEdit = CreateWindowW( L"Edit", ... );
int num = GetWindowTextLength(hEdit);
wchar_t buffer[num+1];
GetWindowTextW( hEdit, buffer, num+1 );
for( int i=0, id=0; id<=num; i++, id++ ) {
while( buffer[id]=='\r' )
id++;
buffer[i] = buffer[id];
}
FILE* file = fopen( "test.txt", "w,ccs=UTF-8" );
fwprintf( file, L"%s", buffer );
fclose(file);