Skip to content

Commit 3ee7d59

Browse files
committed
QgsVectorFileWriter::MetaData: add a compulsoryEncoding member
* Some formats require a compulsory encoding, typically UTF-8. Change initMetadata() to indicate UTF-8 compulsory encoding for GeoJSON, GeoRSS, GML, GPKG, GPX, KML, SQLite, SpatiaLite, FileGDB, XLSX and ODS * QgsVectorFileWriter::init(): make it override the user specified encoding if the format has a compulsory encoding. And remove hard-coded case for KML.
1 parent b1efb9a commit 3ee7d59

File tree

3 files changed

+39
-28
lines changed

3 files changed

+39
-28
lines changed

python/core/qgsvectorfilewriter.sip

+3-1
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,16 @@ class QgsVectorFileWriter
7474
{
7575
MetaData();
7676

77-
MetaData( const QString& longName, const QString& trLongName, const QString& glob, const QString& ext, const QMap<QString, QgsVectorFileWriter::Option*>& driverOptions, const QMap<QString, QgsVectorFileWriter::Option*>& layerOptions );
77+
MetaData( const QString& longName, const QString& trLongName, const QString& glob, const QString& ext, const QMap<QString, QgsVectorFileWriter::Option*>& driverOptions, const QMap<QString, QgsVectorFileWriter::Option*>& layerOptions, const QString& compulsoryEncoding = QString() );
7878

7979
QString longName;
8080
QString trLongName;
8181
QString glob;
8282
QString ext;
8383
QMap<QString, QgsVectorFileWriter::Option*> driverOptions;
8484
QMap<QString, QgsVectorFileWriter::Option*> layerOptions;
85+
/** Some formats require a compulsory encoding, typically UTF-8. If no compulsory encoding, empty string */
86+
QString compulsoryEncoding;
8587
};
8688

8789
enum WriterError

src/core/qgsvectorfilewriter.cpp

+32-26
Original file line numberDiff line numberDiff line change
@@ -238,21 +238,6 @@ void QgsVectorFileWriter::init( QString vectorFileName,
238238

239239
deleteShapeFile( vectorFileName );
240240
}
241-
else if ( driverName == "KML" )
242-
{
243-
if ( !vectorFileName.endsWith( ".kml", Qt::CaseInsensitive ) )
244-
{
245-
vectorFileName += ".kml";
246-
}
247-
248-
if ( fileEncoding.compare( "UTF-8", Qt::CaseInsensitive ) != 0 )
249-
{
250-
QgsDebugMsg( "forced UTF-8 encoding for KML" );
251-
fileEncoding = "UTF-8";
252-
}
253-
254-
QFile::remove( vectorFileName );
255-
}
256241
else
257242
{
258243
if ( metadataFound )
@@ -277,6 +262,16 @@ void QgsVectorFileWriter::init( QString vectorFileName,
277262
QFile::remove( vectorFileName );
278263
}
279264

265+
if ( metadataFound && !metadata.compulsoryEncoding.isEmpty() )
266+
{
267+
if ( fileEncoding.compare( metadata.compulsoryEncoding, Qt::CaseInsensitive ) != 0 )
268+
{
269+
QgsDebugMsg( QString( "forced %1 encoding for %2" ).arg( metadata.compulsoryEncoding ).arg( driverName ) );
270+
fileEncoding = metadata.compulsoryEncoding;
271+
}
272+
273+
}
274+
280275
char **options = nullptr;
281276
if ( !datasourceOptions.isEmpty() )
282277
{
@@ -865,7 +860,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
865860
"*.geojson",
866861
"geojson",
867862
datasetOptions,
868-
layerOptions
863+
layerOptions,
864+
"UTF-8"
869865
)
870866
);
871867

@@ -959,7 +955,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
959955
"*.xml",
960956
"xml",
961957
datasetOptions,
962-
layerOptions
958+
layerOptions,
959+
"UTF-8"
963960
)
964961
);
965962

@@ -1048,7 +1045,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
10481045
"*.gml",
10491046
"gml",
10501047
datasetOptions,
1051-
layerOptions
1048+
layerOptions,
1049+
"UTF-8"
10521050
)
10531051
);
10541052

@@ -1090,7 +1088,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
10901088
"*.gpkg",
10911089
"gpkg",
10921090
datasetOptions,
1093-
layerOptions
1091+
layerOptions,
1092+
"UTF-8"
10941093
)
10951094
);
10961095

@@ -1168,7 +1167,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
11681167
"*.gpx",
11691168
"gpx",
11701169
datasetOptions,
1171-
layerOptions
1170+
layerOptions,
1171+
"UTF-8"
11721172
)
11731173
);
11741174

@@ -1233,7 +1233,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
12331233
"*.kml",
12341234
"kml",
12351235
datasetOptions,
1236-
layerOptions
1236+
layerOptions,
1237+
"UTF-8"
12371238
)
12381239
);
12391240

@@ -1498,7 +1499,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
14981499
"*.sqlite",
14991500
"sqlite",
15001501
datasetOptions,
1501-
layerOptions
1502+
layerOptions,
1503+
"UTF-8"
15021504
)
15031505
);
15041506

@@ -1579,7 +1581,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
15791581
"*.sqlite",
15801582
"sqlite",
15811583
datasetOptions,
1582-
layerOptions
1584+
layerOptions,
1585+
"UTF-8"
15831586
)
15841587
);
15851588
// AutoCAD DXF
@@ -1669,7 +1672,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
16691672
"*.gdb",
16701673
"gdb",
16711674
datasetOptions,
1672-
layerOptions
1675+
layerOptions,
1676+
"UTF-8"
16731677
)
16741678
);
16751679

@@ -1694,7 +1698,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
16941698
"*.xlsx",
16951699
"xlsx",
16961700
datasetOptions,
1697-
layerOptions
1701+
layerOptions,
1702+
"UTF-8"
16981703
)
16991704
);
17001705

@@ -1719,7 +1724,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
17191724
"*.ods",
17201725
"ods",
17211726
datasetOptions,
1722-
layerOptions
1727+
layerOptions,
1728+
"UTF-8"
17231729
)
17241730
);
17251731

src/core/qgsvectorfilewriter.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,14 @@ class CORE_EXPORT QgsVectorFileWriter
120120
MetaData()
121121
{}
122122

123-
MetaData( const QString& longName, const QString& trLongName, const QString& glob, const QString& ext, const QMap<QString, Option*>& driverOptions, const QMap<QString, Option*>& layerOptions )
123+
MetaData( const QString& longName, const QString& trLongName, const QString& glob, const QString& ext, const QMap<QString, Option*>& driverOptions, const QMap<QString, Option*>& layerOptions, const QString& compulsoryEncoding = QString() )
124124
: longName( longName )
125125
, trLongName( trLongName )
126126
, glob( glob )
127127
, ext( ext )
128128
, driverOptions( driverOptions )
129129
, layerOptions( layerOptions )
130+
, compulsoryEncoding( compulsoryEncoding )
130131
{}
131132

132133
QString longName;
@@ -135,6 +136,8 @@ class CORE_EXPORT QgsVectorFileWriter
135136
QString ext;
136137
QMap<QString, Option*> driverOptions;
137138
QMap<QString, Option*> layerOptions;
139+
/** Some formats require a compulsory encoding, typically UTF-8. If no compulsory encoding, empty string */
140+
QString compulsoryEncoding;
138141
};
139142

140143
enum WriterError

0 commit comments

Comments
 (0)