我的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
那么宽字符版本_wfopen
和fwprintf
呢?
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吗?
感谢您的任何建议。
答案 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);