[转]解决中文操作系统下编译XBMC的问题

在中文操作系统下编译XBMC会出现一些问题,有一些因为代码页问题造成的warning和error,
由于开发团队一般是在英文系统下编译的,所以源代码文件默认都是英文代码页来解析的,
一般情况下都没有问题,但对于某些显式写出来的英文代码页下的非ASCII字符,到中文环境
下编译就出问题了,中文代码页会把这些字符以中文的编码去解读,有些和C语言字符串定界符
双引号"在中文代码页下错误的合并解析导致编译语法错误,如果把这些源文件另存为utf8或者
unicode也是不行的,因为要转换的字符串里本身必须要求是英文代码页的编码,所以强制另存
utf8或者unicode的话,就会导致错误的乱码执行结果,比如看到的就是天气里的℃是乱码。
一个简单的解决办法就是把操作系统的默认区域设为英文来编译,但这样觉得不是很方便。
还有一个办法就是把那些必须英文代码页下的源文件中的非ASCII字符串用C语言中的转义
字符串代替皆可,这样就和代码页没关系了,比如把 "℃" 写成 "\xB0\x43" 即可。
我分析了一下,会导致编译错误的文件如下:
/guilib/LocalizeStrings.cpp
大约在Line128,修改如下:

// fill in the constant strings
m_strings[20022] = "";
m_strings[20027] = ToUTF8(encoding, "°F");   改成    m_strings[20027] = ToUTF8(encoding, "\xB0\x46");
m_strings[20028] = ToUTF8(encoding, "K");
m_strings[20029] = ToUTF8(encoding, "°C");   改成    m_strings[20029] = ToUTF8(encoding, "\xB0\x43");
m_strings[20030] = ToUTF8(encoding, "°Ré");  改成    m_strings[20030] = ToUTF8(encoding, "\xB0\x52\xE9");
m_strings[20031] = ToUTF8(encoding, "°Ra");  改成    m_strings[20031] = ToUTF8(encoding, "\xB0\x52\x61");
m_strings[20032] = ToUTF8(encoding, "°Rø");  改成    m_strings[20032] = ToUTF8(encoding, "\xB0\x52\xF8");
m_strings[20033] = ToUTF8(encoding, "°De");  改成    m_strings[20033] = ToUTF8(encoding, "\xB0\x44\x65");
m_strings[20034] = ToUTF8(encoding, "°N");   改成    m_strings[20034] = ToUTF8(encoding, "\xB0\x4E");



/lib/fribidi/fribidi_char_sets_cp1255.c
/lib/fribidi/fribidi_char_sets_cp1256.c
/lib/fribidi/fribidi_char_sets_isiri_3342.c
/lib/fribidi/fribidi_char_sets_iso8859_6.c
/lib/fribidi/fribidi_char_sets_iso8859_8.c

这几个文件里导致错误的都是一句,可作如下修改:
return '¿';   改成   return '\xBF';

/xbmc/lib/libhttpapi/XBMChttp.cpp
大约在 Line2780-2786 之间改成:

    if(strInfo.Find("\xEF\xBF\xBD") && strInfo.Find("\xEF\xBF\xBD"))
    {
      // The Charset Converter ToUtf8() will add. only in this case= "\xEF\xBF\xBD" a char "\xC2\xB0" during converting, 
      // which is the right value for the GUI!
      // A length depending fix in CCharsetConverter::stringCharsetToUtf8() will couse a wrong char in GUI. 
      // So just for http, we remove the "\xEF\xBF\xBD", to fix BUG ID:[1586251]
      strInfo.Replace("\xEF\xBF\xBD","");
    }


另外还有一些文件,非ascii字符都在代码注释里,中文区域下编译会产生warning C4819,不需要修改

/lib/libiconv/include/iconv.h
/xbmc/lib/libscrobbler/errors.h
/xbmc/lib/libapetag/apetaglib.c
/xbmc/lib/libUPnP/Neptune/Source/Core/NptXml.cpp
/xbmc/lib/cximage-6.0/cximage/ximadsp.cpp
/xbmc/cores/paplayer/YMCodec/StSoundLibrary/YmMusic.cpp
/xbmc/cores/paplayer/YMCodec/StSoundLibrary/Ymload.cpp
/xbmc/cores/paplayer/vgmstream/src/meta/ps2_mib.c
/xbmc/cores/paplayer/SIDCodec/libsidplay/src/reloc65.c
/xbmc/cores/dvdplayer/codecs/libfaad2/libfaad/syntax.c
/xbmc/cores/dvdplayer/codecs/libfaad2/libfaad/mdct.c
/xbmc/cores/dvdplayer/dvdcodecs/dvdcodecutils.cpp
/xbmc/utils/RssReader.cpp
/xbmc/utils/teletext.cpp



作以上更改后,就可以在中文区域下正确编译了,不用再把操作系统切换到英文区域下了。
希望斑竹们最好能提交到官方版本,这样以后在中文系统下更新编译就方便了。

http://bbs.htpc1.com/viewthread.php?tid=107638

原文地址:https://www.cnblogs.com/logitechlike/p/2875696.html