最近在修改mozilla中的mailnews模块的导入出功能相关组件,让调用该组件后的行为不是从mozilla的mork数据库中导入导出通讯录,而是从我们的应用本身的SQLite数据库中导入导出数据,导入导出功能的修改在对mailnews中处理csv和ldif分析处理代码后基本可用,这个时候出现一个问题,因为导出的时候文件编码和文件名字的字符集都是使用操作系统的默认字符集,而导入的时候需要将文件名和文件内容写进数据库,如果字符集不对,应用的显示界面就会出现乱码。由于进度原因,我做了一个邪恶的事情,在cpp组件里面进行硬编码式的转换,把内容当成gb2312进行转换,因为基本使用的是中文的windows,所以这样处理显示一般都是正常的。但是要修改代码适应不同语言环境的操作系统,我在mozilla的源码进行寻找(没啥文档找东西是很痛苦的)。找到一个获取操作系统默认字符集的方法(仅限在cpp组件,js无法调用,因为相关组件没有idl文件定义接口只有.h定义接口),调用流程代码snippet如下:
nsCOMPtr localeService =
do_GetService(NS_LOCALESERVICE_CONTRACTID, &rv);
if (NS_SUCCEEDED(rv)) {
nsCOMPtr appLocale;
rv = localeService->GetApplicationLocale(getter_AddRefs(appLocale));
if (NS_SUCCEEDED(rv)) {
nsAutoString localeStr;
rv = appLocale->
GetCategory(NS_LITERAL_STRING(NSILOCALE_TIME), localeStr);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get app locale info");
nsCOMPtr platformCharset =
do_GetService(NS_PLATFORMCHARSET_CONTRACTID, &rv);
if (NS_SUCCEEDED(rv)) {
nsCAutoString charset;
rv = platformCharset->GetDefaultCharsetForLocale(localeStr, charset);
if (NS_SUCCEEDED(rv)) {
// get/create unicode decoder for charset
nsCOMPtr ccm =
do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &rv);
if (NS_SUCCEEDED(rv))
ccm->GetUnicodeDecoder(charset.get(), &gDecoder);
}
}
}
相关源代码文件在mozilla\intl\uconv\public\nsIPlatformCharset.h
mozilla\intl\locale\idl\nsILocaleService.idl。
阅读(1174) | 评论(0) | 转发(0) |