Mein WinAPI-Programm zielt darauf ab, Text von einem Edit control zu nehmen und es in einer Datei zu speichern.fwprintf setzt Carriage-Return vor dem Zeilenvorschub
Wenn fopen
die Datei im Textmodus "w"
schafft, dann macht fprintf
Zeilenvorschub LF
Zeichen durch einen Wagenrücklauf CR
vorangestellt werden.
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);
Above Code schreibt nicht CR
LF
in der Datei, aber:
CR
CR
LF
(0D 0D 0A)
Ich weiß, hier in der ANSI-Version der Lösung ist es, die Datei im Binärmodus zu öffnen: "wb"
anstelle von "w"
, das macht keine CR
LF
Übersetzung oder Zeichenumwandlung findet während der Ausgabe statt.
Aber ich möchte Unicode-Zeichen in Edit-Steuerelement eingeben, und die Datei UTF-8 mit BOM codiert.
Was ist also mit den Wide-Character-Versionen _wfopen
und 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);
Above-Code nicht ï
»
¿
CR
LF
in die Datei schreiben, aber:
ï
»
¿
CR
CR
LF
(EF BB BF 0D 0D 0A)
Keine Möglichkeit, diezu verwendenbinärer Modus, um die CR
Addition zu vermeiden.
FILE* file = _wfopen(L"test.txt", L"wb,ccs=UTF-8");
Schreibt in der Datei des erwarteten \r\n
aber codierte UTF-16, ohne BOM:
CR
NUL
LF
NUL
(0D 00 0A 00)
Wie vermeiden Sie diesen CR
Verbreitung für eine UTF-8-Datei?
Bin ich gezwungen, es UTF-16 zu kodieren?
Danke für jeden Vorschlag.
Ich glaube wirklich, dass Wide-Character-Versionen der I/O-Funktionen nichts über UTF-8 wissen.Das ist keine "breite" Kodierung, es ist eine variable Breite. – unwind
Um "" b "" und "" zu verwenden oder nicht, hängt von einem nicht erklärten Codierungsziel ab: Wollen Sie Dateien exakt gleich ausdrucken, auch wenn Code auf verschiedenen Plattformen kompiliert wurde (Benutzen Sie "b" und) die Zeilenendung der Wahl '" \ r \ n "' oder '" \ n "')? Oder möchten Sie, dass die Zeilenendung dem Inhalt des Compilers entspricht. (Verwenden Sie nicht "b" und "\ r" '). Was willst du _across_ Plattformen? Dies ist wirklich ein Compiler-Abschnitt, keine OS-Auswahl. – chux
@unwind: '_wfopen' und' fwprintf' verwalten UTF-8 perfekt, dank dem Flag '" ccs = UTF-8 "' fügen sie die 'ï» ¿'BOM hinzu und machen alle Zeichen bei einer breiten Zeicheneingabe um. Der einzige Fehler besteht darin, [jeden Zeilenvorschub während der Ausgabe in eine Wagenrücklauf/Zeilenvorschub-Kombination zu übersetzen] (https://msdn.microsoft.com/en-us/library/aa273067.aspx). – Salvador