Hallo,
ich versuche gerade ein VDR-Plugin für die ARM-Architekturen bauen zu lassen, bei dem der Author versucht hat einen non-breaking Space als nullterminierte UTF-8 und latin-1 encodierte Zeichen in einen Char-Array zu packen: vdr-projects/vdr-plugin-xmltv2vdr/blob/master/import.cpp.
Wenn ich das ganze für amd64 baue, klappt das, für ARM aber nicht (bzw. nur mit -std=c++03
, was ich nicht will), da bekomme ich folgende Fehlermeldung (Buildlog):
import.cpp: In member function ‘char* cImport::AddEOT2Description(char*, bool)’: import.cpp:264:37: error: narrowing conversion of ‘-62’ from ‘int’ to ‘char’ [-Wnarrowing] 264 | const char nbspUTF8[]={-62,-96,0}; | ^ import.cpp:264:37: error: narrowing conversion of ‘-96’ from ‘int’ to ‘char’ [-Wnarrowing] import.cpp:280:41: error: narrowing conversion of ‘-96’ from ‘int’ to ‘char’ [-Wnarrowing] 280 | const char nbsp[]={-96,0}; | ^ make[2]: *** [Makefile:70: import.o] Error 1
Das Problem entsteht wenn ich das richtig verstehe dadurch, dass char
je nach Plattform signed bzw. unsigned ist.
In Python wäre das ja recht einfach die Bytes anzugeben: b'\xc2\xa0\x00'
- darf man das in C++ so als String Literal hinterlegen?
1 2 3 4 5 6 7 | #include <iostream> int main() { const char nbspUTF8[]{"\u00A0\0}"}; // nbsp für UTF-8 const char nbsp[]{"\240\0"}; // nbsp für latin-1 std::cout << "'" << nbspUTF8 << "'\n"; std::cout << "'" << nbsp << "'\n"; } |
Ist das ein guter Weg (zumindest akzeptiert das der Compiler auf einem armv7h und einem amd64 System so ohne zu meckern und laut xxd kommt das gleiche raus) und gibt es da noch andere empfehlenswerte Möglichkeiten das umzusetzen?