diff --git a/src/core/dxf/qgsdxfexport.cpp b/src/core/dxf/qgsdxfexport.cpp index 8384965658a6..5916c0b7e5f3 100644 --- a/src/core/dxf/qgsdxfexport.cpp +++ b/src/core/dxf/qgsdxfexport.cpp @@ -319,7 +319,7 @@ void QgsDxfExport::writeHeader( const QString &codepage ) // ACADVER writeGroup( 9, QStringLiteral( "$ACADVER" ) ); - writeGroup( 1, QStringLiteral( "AC1015" ) ); + writeGroup( 1, QStringLiteral( "AC1018" ) ); // EXTMIN writeGroup( 9, QStringLiteral( "$EXTMIN" ) ); @@ -2354,20 +2354,17 @@ QString QgsDxfExport::layerName( const QString &id, const QgsFeature &f ) const QString QgsDxfExport::dxfEncoding( const QString &name ) { - const QList< QByteArray > codecs = QTextCodec::availableCodecs(); - for ( const QByteArray &codec : codecs ) + const QByteArray codec = name.toLocal8Bit(); + if ( QTextCodec::codecForName( codec ) ) { - if ( name != codec ) - continue; - int i; - for ( i = 0; i < static_cast< int >( sizeof( DXF_ENCODINGS ) / sizeof( *DXF_ENCODINGS ) ) && name != DXF_ENCODINGS[i][1]; ++i ) + for ( i = 0; i < static_cast< int >( sizeof( DXF_ENCODINGS ) / sizeof( *DXF_ENCODINGS ) ) && strcasecmp( codec.data(), DXF_ENCODINGS[i][1] ) != 0; ++i ) ; - if ( i == static_cast< int >( sizeof( DXF_ENCODINGS ) / sizeof( *DXF_ENCODINGS ) ) ) - continue; - - return DXF_ENCODINGS[i][0]; + if ( i != static_cast< int >( sizeof( DXF_ENCODINGS ) / sizeof( *DXF_ENCODINGS ) ) ) + { + return DXF_ENCODINGS[i][0]; + } } return QString(); diff --git a/tests/src/core/testqgsdxfexport.cpp b/tests/src/core/testqgsdxfexport.cpp index fe8e80c1a5e7..5ad5031fecad 100644 --- a/tests/src/core/testqgsdxfexport.cpp +++ b/tests/src/core/testqgsdxfexport.cpp @@ -84,6 +84,7 @@ class TestQgsDxfExport : public QObject void testExtentWithSelection(); void testOutputLayerNamePrecedence(); void testMinimumLineWidthExport(); + void testWritingCodepage(); private: QgsVectorLayer *mPointLayer = nullptr; @@ -1958,6 +1959,35 @@ void TestQgsDxfExport::testMinimumLineWidthExport() QVERIFY( !fileContainsText( file, QStringLiteral( " 43\n7.0" ) ) ); } +void TestQgsDxfExport::testWritingCodepage() +{ + QgsDxfExport d; + d.addLayers( QList() << QgsDxfExport::DxfLayer( mPointLayer ) ); + + QgsMapSettings mapSettings; + const QSize size( 640, 480 ); + mapSettings.setOutputSize( size ); + mapSettings.setExtent( mPointLayer->extent() ); + mapSettings.setLayers( QList() << mPointLayer ); + mapSettings.setOutputDpi( 96 ); + mapSettings.setDestinationCrs( mPointLayer->crs() ); + + d.setMapSettings( mapSettings ); + d.setSymbologyScale( 1000 ); + + const QString file1 = getTempFileName( "CP1252UpperCase_dxf" ); + QFile dxfFile1( file1 ); + QCOMPARE( d.writeToFile( &dxfFile1, QStringLiteral( "CP1252" ) ), QgsDxfExport::ExportResult::Success ); + dxfFile1.close(); + QVERIFY( fileContainsText( file1, QStringLiteral( "ANSI_1252" ) ) ); + + const QString file2 = getTempFileName( "cp1252lowercase_dxf" ); + QFile dxfFile2( file2 ); + QCOMPARE( d.writeToFile( &dxfFile2, QStringLiteral( "cp1252" ) ), QgsDxfExport::ExportResult::Success ); + dxfFile2.close(); + QVERIFY( fileContainsText( file2, QStringLiteral( "ANSI_1252" ) ) ); +} + bool TestQgsDxfExport::fileContainsText( const QString &path, const QString &text, QString *debugInfo ) const { QStringList debugLines;