diff --git a/gerbview/job_file_reader.cpp b/gerbview/job_file_reader.cpp index 419d190a46..8b0311771b 100644 --- a/gerbview/job_file_reader.cpp +++ b/gerbview/job_file_reader.cpp @@ -92,6 +92,11 @@ private: REPORTER* m_reporter; wxFileName m_filename; wxArrayString m_GerberFiles; // List of gerber files in job + + // Convert a JSON string, that uses escaped sequence of 4 hexdecimal digits + // to encode unicode chars when not ASCII7 codes + // json11 converts this sequence to UTF8 string + wxString formatStringFromJSON( const std::string& name ); }; @@ -136,10 +141,8 @@ bool GERBER_JOBFILE_READER::ReadGerberJobFile() for( auto& entry : json_parser["FilesAttributes"].array_items() ) { - //wxLogMessage( entry.dump().c_str() ); std::string name = entry["Path"].string_value(); - //wxLogMessage( name.c_str() ); - m_GerberFiles.Add( FormatStringFromGerber( name ) ); + m_GerberFiles.Add( formatStringFromJSON( name ) ); } } else @@ -155,6 +158,17 @@ bool GERBER_JOBFILE_READER::ReadGerberJobFile() } +wxString GERBER_JOBFILE_READER::formatStringFromJSON( const std::string& name ) +{ + // Convert a JSON string, that uses a escaped sequence of 4 hexdecimal digits + // to encode unicode chars + // Our json11 library returns in this case a UTF8 sequence. Just convert it to + // a wxString. + wxString wstr = FROM_UTF8( name.c_str() ); + return wstr; +} + + bool GERBVIEW_FRAME::LoadGerberJobFile( const wxString& aFullFileName ) { wxFileName filename = aFullFileName; diff --git a/pcbnew/exporters/gerber_jobfile_writer.cpp b/pcbnew/exporters/gerber_jobfile_writer.cpp index ebc5744ca1..31b6449913 100644 --- a/pcbnew/exporters/gerber_jobfile_writer.cpp +++ b/pcbnew/exporters/gerber_jobfile_writer.cpp @@ -55,6 +55,26 @@ GERBER_JOBFILE_WRITER::GERBER_JOBFILE_WRITER( BOARD* aPcb, REPORTER* aReporter ) m_indent = 0; } + +std::string GERBER_JOBFILE_WRITER::formatStringFromUTF32( const wxString& aText ) +{ + std::string fmt_text; // the text after UTF32 to UTF8 conversion + + for( unsigned long letter: aText ) + { + if( letter >= ' ' && letter <= 0x7F ) + fmt_text += char( letter ); + else + { + char buff[10]; + sprintf( buff, "\\u%4.4lX", letter ); + fmt_text += buff; + } + } + return fmt_text; +} + + enum ONSIDE GERBER_JOBFILE_WRITER::hasSilkLayers() { int flag = SIDE_NONE; @@ -396,10 +416,8 @@ void GERBER_JOBFILE_WRITER::addJSONFilesAttributes() if( !skip_file ) { - // name can contain non ASCII7 chars. - // Only ASCII7 chars are accepted in gerber files. others must be converted to - // a gerber hexa sequence. - std::string strname = formatStringToGerber( name ); + // Ensure the name is JSON compatible. + std::string strname = formatStringFromUTF32( name ); openBlock(); addJSONObject( wxString::Format( "\"Path\": \"%s\",\n", strname.c_str() ) ); diff --git a/pcbnew/exporters/gerber_jobfile_writer.h b/pcbnew/exporters/gerber_jobfile_writer.h index 89033fbd73..7704b0e228 100644 --- a/pcbnew/exporters/gerber_jobfile_writer.h +++ b/pcbnew/exporters/gerber_jobfile_writer.h @@ -202,6 +202,11 @@ private: addIndent(); m_JSONbuffer << aParam; } + /** A helper function to convert a wxString ( therefore a Unicode text ) to + * a JSON compatible string (a escaped unicode sequence of 4 hexa). + */ + std::string formatStringFromUTF32( const wxString& aText ); + private: BOARD* m_pcb; // The board REPORTER* m_reporter; // a reporter for messages (can be null)