diff --git a/.gitignore b/.gitignore
index eb88b9ccfafd3c03fba70797e06eaf47066d1934..4ce455e4e95185668de32892133e7cb6ffeadad5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 *.min.js.map
-.idea/
\ No newline at end of file
+.idea/
+.vscode
\ No newline at end of file
diff --git a/externallib.php b/externallib.php
index dccc9412a240d4299a491c5e78ce8fdf71beb9ca..e6dd8547ff001d3e0eaf38b82a8e03e65cb1b3db 100644
--- a/externallib.php
+++ b/externallib.php
@@ -192,8 +192,9 @@ class qtype_moopt_external extends external_api {
                             break;
                         } else if ($child->localName == 'attached-txt-file') {
                             $pathinfo = pathinfo('/' . $child->nodeValue);
+                            $encoding = $child->attributes->getNamedItem('encoding')->nodeValue;
                             $filecontent = get_text_content_from_file($usercontext, $draftid, $keepfilename,
-                                $pathinfo['dirname'] . '/', $pathinfo['basename']);
+                                $pathinfo['dirname'] . '/', $pathinfo['basename'], true, $encoding);
                             $defaultfilename = basename($child->nodeValue);
                             $fileid = $file->attributes->getNamedItem('id')->nodeValue;
                             $enablefreetext = true;
@@ -259,8 +260,9 @@ class qtype_moopt_external extends external_api {
                         } else if ($child->localName == 'attached-txt-file') {
                             $pathinfo = pathinfo('/' . $child->nodeValue);
                             $filename = basename($child->nodeValue);
+                            $encoding = $child->attributes->getNamedItem('encoding')->nodeValue;
                             $filecontent = get_text_content_from_file($usercontext, $draftid, $keepfilename,
-                                $pathinfo['dirname'] . '/', $pathinfo['basename']);
+                                $pathinfo['dirname'] . '/', $pathinfo['basename'], true, $encoding);
                         }
 
                         if(!empty($filecontent))
diff --git a/locallib.php b/locallib.php
index 05cefaba98f9a2a8b9ef24a1f9fec9de96eeccc5..4a1df0d2cf4cfb395411ca411d39d3406011b749 100644
--- a/locallib.php
+++ b/locallib.php
@@ -282,7 +282,7 @@ function create_domdocument_from_task_xml($usercontext, $draftareaid, $xmlfilena
  * @return string
  * @throws invalid_parameter_exception
  */
-function get_text_content_from_file($usercontext, $draftareaid, $keepfilename, $filepath, $filename)
+function get_text_content_from_file($usercontext, $draftareaid, $keepfilename, $filepath, $filename, $attached, $encoding)
 {
     $fs = get_file_storage();
     $file = $fs->get_file($usercontext->id, 'user', 'draft', $draftareaid, $filepath, $filename);
@@ -294,7 +294,22 @@ function get_text_content_from_file($usercontext, $draftareaid, $keepfilename, $
     // TODO: make sure the mimetype is plain text
     // even task.xmls may contain mistakes (eg PDF )
 
-    return $file->get_content();
+    //check if encoding of attached ist utf-8 else convert
+    $content = $file->get_content();
+    if($encoding!==false){
+        $enc=$encoding;
+    } else {
+        $enc = mb_detect_encoding($content, mb_detect_order(), true);
+        if($enc===false){
+            throw new invalid_parameter_exception('Encoding of attached file ' . $filepath . $filename . 'could\'nt be detectet.');
+        }
+    }
+    $content = mb_convert_encoding($content, $enc, 'UTF-8');
+    if($enc!=='UTF-8'){
+        $content = mb_convert_encoding($content, 'UTF-8', $enc);
+    }
+
+    return $content;
 }