在这篇文章(http://blog.csdn.net/zhouschina/article/details/8701503)中,说明了如何解决写DXF文件中文乱码问题,但是有时会引起DXF文件使用AutoCAD打不开,提示:
DXF 读取错误 第 141003 行。
DXF 输入无效或不完整 -- 图形被放弃。
使用记事本打开dxf文件会发现,转码发生错误:
将 中国 两个汉字转为了 謀U+0439? 后面多了 ?
要解决问题,于是读取其源码,发现在ogrdxfwritelayer.cpp文件中,WriteTEXT()函数中,代码第484-489行,有如下代码:
/* -------------------------------------------------------------------- */ /* Escape the text, and convert to ISO8859. */ /* -------------------------------------------------------------------- */ const char *pszText = poLabel->TextString( bDefault ); if( pszText != NULL && !bDefault ) { CPLString osEscaped = TextEscape( pszText ); WriteValue( 1, osEscaped ); }
在写注记值的时候,进行了TextEscape处理,将字符串转为了ISO8859,既然我们使用的是中文版cad,中文版系统,干脆注释掉TextEscape,修改代码如下:
/* -------------------------------------------------------------------- */ /* Escape the text, and convert to ISO8859. */ /* -------------------------------------------------------------------- */ const char *pszText = poLabel->TextString( bDefault ); if( pszText != NULL && !bDefault ) { // CPLString osEscaped = TextEscape( pszText ); WriteValue( 1, pszText ); }
重新编译GDAL1.9.2。(不过修改之前,也要进行文章http://blog.csdn.net/zhouschina/article/details/8701503中的操作)。
下面我们解决读dxf出现的中文乱码问题:
读文件出现中文乱码,也是GDAL/OGR内部进行了转码。我们查看ogrdxflayer.cpp中,读取注记的函数TranslateMTEXT()和TranslateTEXT()函数,在TranslateMTEXT()中,也就是cpp文件中第449-454行代码,如下:
case 1: case 3: if( osText != "" ) osText += "\n"; osText += TextUnescape(szLineBuf); break;
可以看到也进行了转码,TextUnescape函数将ISO8859转为UTF8编码。我们修改代码为:
case 1: case 3: if( osText != "" ) osText += "\n"; osText += CPLString (szLineBuf); break;
在TranslateTEXT()函数中,第638-645行代码,如下:
/* -------------------------------------------------------------------- */ /* Translate text from Win-1252 to UTF8. We approximate this */ /* by treating Win-1252 as Latin-1. */ /* -------------------------------------------------------------------- */ osText.Recode( poDS->GetEncoding(), CPL_ENC_UTF8 ); poFeature->SetField( "Text", osText );
修改如下:
/* -------------------------------------------------------------------- */ /* Translate text from Win-1252 to UTF8. We approximate this */ /* by treating Win-1252 as Latin-1. */ /* -------------------------------------------------------------------- */ //osText.Recode( poDS->GetEncoding(), CPL_ENC_UTF8 ); poFeature->SetField( "Text", osText );
重新编译GDAL1.9.2。
搞定!