C fwprintf将回车置于换行之前

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

我的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 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
CR
LF
(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);