如何从每个Eclipse文件中读取源内容类型?

时间:2015-11-25 16:30:53

标签: eclipse character-encoding iconv

我有一个包含多个源文件的Eclipse项目,其中包含一系列不同的编码:一些文件是UTF8,其他文件是ISO-8859-1,其他文件是windows-1252

此外,有些文件的编码是显式的(可以在每个文件 Properties 窗口中看到),而其他文件的文件是从容器继承

我需要将它们转换为UTF8 - 而且我已经发现我可以使用iconv了解详细信息 - 请参阅my answer here,但由于它们超过一千,我无法转换它们一个接一个:是否有任何编程方式从IDE或类似的东西获取编码?

我在Windows上,我可能会做一些shell脚本和/或编写辅助软件。

1 个答案:

答案 0 :(得分:0)

项目文件的字符集设置可以在${PROJECT_FOLDER}/.settings/org.eclipse.core.resources.prefs中找到 由于项目中有这么多文件。创建一个简单的Eclipse插件可以减少工作量。以下是步骤:

  1. 选择Eclipse菜单项 New>项目...>插件项目
  2. 接受默认值并转到last page,选择Hello, World模板。
  3. 打开并编辑plugin.xml,在依赖关系页面中添加所需的插件 org.eclipse.core.resources
  4. 修改SampleAction.java,请参阅下面的示例代码..
  5. 为执行Eclipse Application创建调试配置
  6. 启动eclipse并导入项目。
  7. 选择菜单项示例菜单以调用public void run(IAction action)
  8. Eclipse资源API的示例代码:

    //import org.eclipse.core.resources.*;
    //import org.eclipse.core.runtime.*;
    public void run(IAction action) {
        final boolean keepHistory = true;
        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("yourProjectName");
        project.accept(new IResourceVisitor() {
            public boolean visit(IResource resource) {
                IFile file = (IFile)resource;
                try {
                    String charset = file.getCharset(true);
                    if (!"UTF-8".equals(charset)) {
                        InputStream is = file.getContents();
                        //convert to UTF-8 and save it
                        String str = new String(IOUtils.toByteArray(is), charset);
                        file.setContents(new ByteArrayInputStream(str.getBytes("UTF-8")), true, keepHistory, null);
                        //remove charset setting
                        file.setCharset("UTF-8", null);
                    }
                } catch (Throwable e) {
                    //log error... maybe process later via project.getFile(new Path(projectRelativePath))
                    Activator.getDefault().getLog().log(new Status(IStatus.INFO, Activator.PLUGIN_ID, 
                            file.getProjectRelativePath().toString(), e));
                }
                return false;
            }
        }, IResource.DEPTH_INFINITE, IResource.FILE);
    }