查找文件中的中文并替换,以支持程序中英文(国际化)

手头的项目需要国际化,一种常用的实现方式是搞两个语言文件,KEY-VALUE形式。Ini文件是常用的key-value实现。

比如 chinese_file.ini           ID_LOGIN_SUCCESS = 成功

english_file.ini            ID_LOGIN_SUCCESS= success

程序启动时,使用其中的某种文件,并加载到hashmap中。程序使用到多语言的地方使用GetTrueText(KEY) 。

这样无论哪国的语言,程序里面只有看到的key。

目前,程序里面都是中文写死的,第一步就是找到中文写死的地方,这个人工去找的话,肯定是崩溃了。因此写了个小程序。

#include <fstream>
#include <string>
#include <iostream>
#include <assert.h>
#include <windows.h>
using namespace std;

std::string outpath;
bool HasChineseInFile(const std::string& filepath)
{
    //不能读自己,否则有死循环
    if (filepath.find(outpath)!=string::npos)
    {
        return true;
    }

    bool bRet = false;
    ifstream in(filepath.c_str(), ios::in);
    ofstream out(outpath.c_str(), ios::out | ios::app);
    assert(out);
    std::string buff;
    if (in && in.is_open())
    {
        int line = 0;
        while (getline(in, buff))
        {
            for (size_t u = 0; u < buff.length();u++)
            {
                if (buff[u] & 0x80)
                {
                    out << filepath << ":" << line << endl;
                    bRet = true;
                    break;
                }
            }
            ++line;
        }
    }
    in.close();
    out.close();
    return bRet;
}

bool IsDirectory(const std::string& pstrPath)
{
    DWORD dw = GetFileAttributesA(pstrPath.c_str());
    if (dw == INVALID_FILE_ATTRIBUTES)
    {
        return false;
    }
    return (dw & FILE_ATTRIBUTE_DIRECTORY) != 0;
}

bool RecursiveFind(const std::string& pstrFolder)
{
    /*检查输入目录是否是合法目录*/
    if (!IsDirectory(pstrFolder))
    {
        return false;
    }
    std::string strFind = pstrFolder;
    if (*strFind.rbegin() != ‘\\‘ &&
        *strFind.rbegin() != ‘/‘)
    {
        strFind.append("\\");
    }
    strFind.append("*.*");
    /*打开文件查找,查看源目录中是否存在匹配的文件*/
    /*调用FindFile后,必须调用FindNextFile才能获得查找文件的信息*/
    WIN32_FIND_DATAA wfd;
    HANDLE hFind = FindFirstFileA(strFind.c_str(), &wfd);
    if (hFind == INVALID_HANDLE_VALUE)
    {
        return false;
    }
    do
    {
        std::string strSubFolder;
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if (wfd.cFileName[0] == L‘.‘)
            {
                continue;
            }
            else
            {
                strSubFolder = strFind.substr(0, strFind.length() - 3) + wfd.cFileName;
                RecursiveFind(strSubFolder);
            }
        }
        else
        {
            strSubFolder = strFind.substr(0, strFind.length() - 3) + wfd.cFileName;
            HasChineseInFile(strSubFolder.c_str());
        }
    } while (FindNextFileA(hFind, &wfd));

    FindClose(hFind);
    return true;
}

//支持命令行加入参数,1、输入路径、2、输出路径
int _tmain(int argc, char *argv[])
{
    std::string inpath;

    if (argc>1)
    {
        inpath = argv[1];
    }
    if (argc>2)
    {
        outpath = argv[2];
    }
    while (inpath.empty())
    {
        cout << "请输入查找的目录或者文件" << endl;
        cin >> inpath;
        if (GetFileAttributesA(inpath.c_str()) == INVALID_FILE_ATTRIBUTES)
        {
            cout << "文件的路径有误" << endl;
            inpath.clear();
        }
    }
    while (outpath.empty())
    {
        cout << "请输入输出结果的文件" << endl;
        cin >> outpath;
        ofstream out(outpath);
        if (!out)
        {
            cout << "文件的路径有误" << endl;
            outpath.clear();
        }
        out.close();
    }
    //这里有遍历目录的概念
    if (IsDirectory(inpath))
    {
        RecursiveFind(inpath);
    }
    else
    {
        HasChineseInFile(inpath);
    }

    return 0;
}

原文地址:https://www.cnblogs.com/xuhuajie/p/11990792.html

时间: 2024-10-11 17:50:44

查找文件中的中文并替换,以支持程序中英文(国际化)的相关文章

查找文件中除了注释以外的中文

在一些需要国际化的项目中,需要找出曾经代码中的中文替换为其他文字,我这里提供一种比较粗糙的查找小工具check_zh.py.有能改进的地方请大家指出. 环境是linux,python2.6 代码如下: 1 #/usr/bin/env python 2 #coding:utf-8 3 4 import os,sys 5 import re 6 import codecs 7 reload(sys) 8 sys.setdefaultencoding('utf8') 9 10 11 zhPattern

linux命令---查找文件中的内容

linux命令---查找文件中的内容 [[email protected] ~]$ cat 1.txt |egrep '123456789|second'-------匹配123456789或者second的行 first line:123456789012345678901234567890123456789012345678901234567890 second line:one two three four five six seven eight nine ten [[email pro

《Linux学习并不难》Linux常用操作命令(14):grep命令查找文件中符合条件的字符串

8.14  <Linux学习并不难>Linux常用操作命令(14):grep命令查找文件中符合条件的字符串 使用grep命令可以查找文件内符合条件的字符串.          命令语法: grep [选项] [查找模式] [文件] 命令中各选项的含义如表所示. 选项 选项含义 -E 模式是一个可扩展的正则表达式 -F 模式是一组由断行符分隔的定长字符串 -P 模式是一个Perl正则表达式 -b 在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量 -c 只显示匹配行的数量 -i 比较时不

取出csv文件中的中文评论数据

# -*- coding: utf-8 -*- import csv import re csvfile = 'weibo.csv' def columns_data(path, column): columns_data = '' csvfile = open(path, 'r', encoding='utf-8') DicReader = csv.DictReader(csvfile) for row in DicReader: columns_data = columns_data+row

如何解决GBK的编码的文件中的中文转换成为UTF-8编码的文件而且不乱码

首先我们必须明确一点,为什么正常转换会乱码? 因为我们的数据写入是GBK写入的,然后展示的话是按照文件保存形势展示的,前面保存形势是GBK,一致,所以不乱码,而后面将保存形势变成了UTF-8,但是写入的内容是GBK形势的,编码解码方式不一致,所以产生乱码. 我们一般的解决乱码的思路是: String s=new String(str.getBytes("GBK"),"UTF-8"); 我将它解决的思路也是这样子的: 首先我们知道引起乱码的只是因为中文,中文乱码的方式

awk: 随机替换(使用文件中的行随机替换另一文件中的列)

#!/bin/awk -f #Function:指定使用文件中随机数量的行(手动传参ipl和idl)随机替换指定列(脚本中指定):使用指定位数的随机浮点替换指定列(脚本中指定). #Usage:./t.awk -v ip=<ip file> -v id=<id file> -v ipl=<n> -v idl=<n> log.txt #Date: 20140922 20:16 BEGIN {     srand()     #读取预用的ip列表     whi

js文件中的中文提示信息发到jsp中出现乱码解决步骤

.js文件创建默认是gbk编码,该js文件中如果有中文,在utf-8的jsp页面中,显示改中文,为乱码! 解决方法: 1--将原来.js文件中的内容全部复制到剪贴板中: 2--修改js文件的编码格式为utf-8: 3--将剪贴板中的内容黏贴到原来的js文件覆盖原有内容,保存,再测试就没有问题了.

python3处理json文件中含有中文dumps的应用

python3的编码问题一直比较简单 内存中字符串采用unicode 存储到文件中采用utf-8 以下为str,byte互相转换的过程: str = "abc学习" str Out[6]: 'abc学习' mybyte = str.encode("utf-8") mybyte Out[8]: b'abc\xe5\xad\xa6\xe4\xb9\xa0' str2 = mybyte.decode("utf-8") str2 Out[10]: 'ab

查找代码中的中文

上周的需求要发繁体版,用繁体中文替换简体中文,本来想直接转换,但是对方提出很多简体.繁体之间表达方式不同,因此需要批量替换. 尽管前期规划过海外版本,但是最后规范管理不够严格,还是有很多界面上的文字是在代码中写死的. 因此需要开发一个检索代码中中文的工具. 代码给UILabel赋值,必然是uilabel.text = "简体中文";因此检查一行代码中双引号的内容是否有中文,即可完成需求. 需要注意的是编码格式,默认是UTF-8(带签名). 上代码: [MenuItem("As