fwprintf在换行前放回车

时间:2017-01-12 15:17:25

标签: c winapi file-io utf-8 carriage-return

我的WinAPI计划旨在从Edit control获取文本并将其保存到文件中。

fopen以文字模式"w"创建文件时,fprintf会使换行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翻译或字符输出期间发生转换。

但是我想在Edit控件中输入Unicode字符,并将文件编码为带有BOM的UTF-8 那么宽字符版本_wfopenfwprintf呢?

HWND hEdit = CreateWindowW( L"Edit", ... );
// Input in Edit control a single line break "\r\n"
int num = GetWindowTextLength(hEdit);
wchar_t buffer[num+1];
GetWindowTextW( hEdit, buffer, num+1);
FILE* file = _wfopen( L"test.txt", L"w,ccs=UTF-8" );
fwprintf( file, L"%s", buffer );

以上代码不会在文件中写ï » ¿ CR LF,但是:

  

ï » ¿ 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文件的CR扩散? 我被迫编码为UTF-16吗?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

根据建议,可能的解决方案是在将CR写入文件之前删除所有buffer 然后,fwprintf会在每个CR恢复对LF之前设置\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);