diff --git a/src/plugins/git/commitdata.h b/src/plugins/git/commitdata.h
index 00ca2d60c991327895593fadbf4b34a1fa0e29d3..b31bf73c2f146d3327c37e970de5efa1c574586e 100644
--- a/src/plugins/git/commitdata.h
+++ b/src/plugins/git/commitdata.h
@@ -85,6 +85,7 @@ public:
     QStringList unstagedFileNames(const QString &stateFilter = QString()) const;
 
     QString amendSHA1;
+    QString commitEncoding;
     GitSubmitEditorPanelInfo panelInfo;
     GitSubmitEditorPanelData panelData;
 
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index ed79897f55bcb11ee463bdc402d6b05a556af99a..2e164c796e849c570cdab7c8d3b0720d641366cd 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1632,6 +1632,7 @@ bool GitClient::getCommitData(const QString &workingDirectory,
 
     commitData->panelData.author = readConfigValue(workingDirectory, QLatin1String("user.name"));
     commitData->panelData.email = readConfigValue(workingDirectory, QLatin1String("user.email"));
+    commitData->commitEncoding = readConfigValue(workingDirectory, QLatin1String("i18n.commitEncoding"));
 
     // Get the commit template or the last commit message
     if (amend) {
diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp
index a3cb2c231a899f6cc49b726904cb727f56bd3fcf..34a96db285669c92fad9ffe81e97a2e416b6f835 100644
--- a/src/plugins/git/gitsubmiteditor.cpp
+++ b/src/plugins/git/gitsubmiteditor.cpp
@@ -39,6 +39,7 @@
 
 #include <QtCore/QDebug>
 #include <QtCore/QStringList>
+#include <QtCore/QTextCodec>
 
 namespace Git {
 namespace Internal {
@@ -83,6 +84,8 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
     submitEditorWidget()->setPanelData(d.panelData);
     submitEditorWidget()->setPanelInfo(d.panelInfo);
 
+    m_commitEncoding = d.commitEncoding;
+
     m_model = new VCSBase::SubmitFileModel(this);
     addStateFileListToModel(d.stagedFiles,   true,  StagedFile,   m_model);
     addStateFileListToModel(d.unstagedFiles, false, UnstagedFile, m_model);
@@ -128,5 +131,21 @@ GitSubmitEditorPanelData GitSubmitEditor::panelData() const
     return const_cast<GitSubmitEditor*>(this)->submitEditorWidget()->panelData();
 }
 
+QByteArray GitSubmitEditor::fileContents() const
+{
+    const QString& text = const_cast<GitSubmitEditor*>(this)->submitEditorWidget()->descriptionText();
+
+    if (!m_commitEncoding.isEmpty()) {
+        // Do the encoding convert, When use user-defined encoding
+        // e.g. git config --global i18n.commitencoding utf-8
+        QTextCodec *codec = QTextCodec::codecForName(m_commitEncoding.toLocal8Bit());
+        if (codec)
+            return codec->fromUnicode(text);
+    }
+
+    // Using utf-8 as the default encoding
+    return text.toUtf8();
+}
+
 } // namespace Internal
 } // namespace Git
diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h
index f00e5abb2408939520b570c370be109593682ce2..859c01c91623cb1d8d97cc7f09a04b14770887e9 100644
--- a/src/plugins/git/gitsubmiteditor.h
+++ b/src/plugins/git/gitsubmiteditor.h
@@ -60,6 +60,9 @@ public:
 signals:
     void diff(const QStringList &unstagedFiles, const QStringList &stagedFiles);
 
+protected:
+    virtual QByteArray fileContents() const;
+
 private slots:
     void slotDiffSelected(const QStringList &);
 
@@ -67,6 +70,7 @@ private:
     inline GitSubmitEditorWidget *submitEditorWidget();
 
     VCSBase::SubmitFileModel *m_model;
+    QString m_commitEncoding;
 };
 
 } // namespace Internal
diff --git a/src/plugins/perforce/perforcesubmiteditor.cpp b/src/plugins/perforce/perforcesubmiteditor.cpp
index 591de249e2267a402f9af9c5aa1860153576871b..ff960a8c8b0701d5db842a1acaeb61635d0af65e 100644
--- a/src/plugins/perforce/perforcesubmiteditor.cpp
+++ b/src/plugins/perforce/perforcesubmiteditor.cpp
@@ -58,7 +58,7 @@ PerforceSubmitEditorWidget *PerforceSubmitEditor::submitEditorWidget()
     return static_cast<PerforceSubmitEditorWidget *>(widget());
 }
 
-QString PerforceSubmitEditor::fileContents() const
+QByteArray PerforceSubmitEditor::fileContents() const
 {
     const_cast<PerforceSubmitEditor*>(this)->updateEntries();
     QString text;
@@ -70,7 +70,7 @@ QString PerforceSubmitEditor::fileContents() const
     }
     if (Perforce::Constants::debug)
         qDebug() << Q_FUNC_INFO << text;
-    return text;
+    return text.toLocal8Bit();
 }
 
 bool PerforceSubmitEditor::setFileContents(const QString &contents)
diff --git a/src/plugins/perforce/perforcesubmiteditor.h b/src/plugins/perforce/perforcesubmiteditor.h
index 16032cf1b3dbd12a11bea1dcd77ddb5d71c43e52..94a0db2e54819d861b381c03bd133ae4982e2510 100644
--- a/src/plugins/perforce/perforcesubmiteditor.h
+++ b/src/plugins/perforce/perforcesubmiteditor.h
@@ -69,7 +69,7 @@ public:
     static QString fileFromChangeLine(const QString &line);
 
 protected:
-    virtual QString fileContents() const;
+    virtual QByteArray fileContents() const;
     virtual bool setFileContents(const QString &contents);
 
 private:
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index abed23a106586ce365a1b26dbf965394efaf4726..6d60ed038e113ec5cc4abb6c9ec4730c067c9c85 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -456,7 +456,7 @@ bool VCSBaseSubmitEditor::save(QString *errorString, const QString &fileName, bo
 {
     const QString fName = fileName.isEmpty() ? d->m_file->fileName() : fileName;
     Utils::FileSaver saver(fName, QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
-    saver.write(fileContents().toLocal8Bit());
+    saver.write(fileContents());
     if (!saver.finalize(errorString))
         return false;
     if (autoSave)
@@ -467,9 +467,9 @@ bool VCSBaseSubmitEditor::save(QString *errorString, const QString &fileName, bo
     return true;
 }
 
-QString VCSBaseSubmitEditor::fileContents() const
+QByteArray VCSBaseSubmitEditor::fileContents() const
 {
-    return d->m_widget->descriptionText();
+    return d->m_widget->descriptionText().toLocal8Bit();
 }
 
 bool VCSBaseSubmitEditor::setFileContents(const QString &contents)
@@ -616,7 +616,7 @@ bool VCSBaseSubmitEditor::runSubmitMessageCheckScript(const QString &checkScript
         tempFilePattern += QDir::separator();
     tempFilePattern += QLatin1String("msgXXXXXX.txt");
     Utils::TempFileSaver saver(tempFilePattern);
-    saver.write(fileContents().toUtf8());
+    saver.write(fileContents());
     if (!saver.finalize(errorMessage))
         return false;
     // Run check process
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h
index 693b63642902750fa479af2443c690f82bd7a82e..1fa3438d1de0cfc71dab67584674c97157be32ec 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.h
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h
@@ -170,7 +170,7 @@ protected:
     /* These hooks allow for modifying the contents that goes to
      * the file. The default implementation uses the text
      * of the description editor. */
-    virtual QString fileContents() const;
+    virtual QByteArray fileContents() const;
     virtual bool setFileContents(const QString &contents);
 
 private: