docs: private void convertCharset(final File inputFile) {
          if (inputFile.isDirectory()) {
              final File[] files = inputFile.listFiles();
              if (files != null) {
                  for (final File file : files) {
                      convertCharset(file);
                  }
              }
          } else if (FileUtils.isHTMLFile(inputFile.getName())||
                  FileUtils.isHHCFile(inputFile.getName())||
                  FileUtils.isHHKFile(inputFile.getName())) {
  
              final String fileName = inputFile.getAbsolutePath();
              final File outputFile = new File(fileName + FILE_EXTENSION_TEMP);
              log("Processing " + fileName, Project.MSG_INFO);
              BufferedReader reader = null;
              Writer writer = null;
              try {
                  //prepare for the input and output
                  final FileInputStream inputStream = new FileInputStream(inputFile);
                  final InputStreamReader streamReader = new InputStreamReader(inputStream, UTF8);
                  reader = new BufferedReader(streamReader);
  
                  final FileOutputStream outputStream = new FileOutputStream(outputFile);
                  final OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream, UTF8);
                  writer = new BufferedWriter(streamWriter);
  
                  String value = reader.readLine();
                  while(value != null) {
                      //meta tag contains charset found
                      if (value.contains("<meta http-equiv") && value.contains("charset")) {
                          final int insertPoint = value.indexOf("charset=") + "charset=".length();
                          final String subString = value.substring(0, insertPoint);
                          final int remainIndex = value.indexOf(UTF8) + UTF8.length();
                          final String remainString = value.substring(remainIndex);
                          //change the charset
                          final String newValue = (FileUtils.isHHCFile(inputFile.getName()) || FileUtils.isHHKFile(inputFile.getName()) ?
                                                   subString + charsetMap.get(ATTRIBUTE_FORMAT_VALUE_WINDOWS) + remainString :
                                                   subString + charsetMap.get(ATTRIBUTE_FORMAT_VALUE_HTML) + remainString);
                          //write into the output file
                          writer.write(newValue);
                          //add line break
                          writer.write(LINE_SEPARATOR);
                      } else {
                          if (value.contains(tag1)) {
                              value = replaceXmlTag(value, tag1);
                          } else if (value.contains(tag2)) {
                              value = replaceXmlTag(value, tag2);
                          } else if (value.contains(tag3)) {
                              value = replaceXmlTag(value, tag3);
                          }
  
                          //other values
                          writer.write(value);
                          writer.write(LINE_SEPARATOR);
                      }
                      value = reader.readLine();
                  }
              } catch (final FileNotFoundException e) {
                  logger.error(e.getMessage(), e) ;
              } catch (final UnsupportedEncodingException e) {
                  throw new RuntimeException(e);
              } catch (final IOException e) {
                  logger.error(e.getMessage(), e) ;
              } finally {
                  if (reader != null) {
                      try {
                          reader.close();
                      } catch (final IOException e) {
                          logger.error("Failed to close input stream: " + e.getMessage());
                      }
                  }
                  if (writer != null) {
                      try {
                          writer.close();
                      } catch (final IOException e) {
                          logger.error("Failed to close output stream: " + e.getMessage());
                      }
                  }
              }
              try {
                  deleteQuietly(inputFile);
                  moveFile(outputFile, inputFile);
              } catch (final Exception e) {
                  logger.error("Failed to replace " + inputFile + ": " + e.getMessage());
              }
          }
      }