diff --git a/src/main/java/org/sablecc/sablecc/DisplayLicense.java b/src/main/java/org/sablecc/sablecc/DisplayLicense.java
index 75452da78c7e11502f8a9185b05cf6c15a267a62..cc212c4dee299709c44052aed5a31b92163f5b24 100644
--- a/src/main/java/org/sablecc/sablecc/DisplayLicense.java
+++ b/src/main/java/org/sablecc/sablecc/DisplayLicense.java
@@ -10,6 +10,7 @@ package org.sablecc.sablecc;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
 
 class DisplayLicense
 {
@@ -20,7 +21,7 @@ class DisplayLicense
       BufferedReader in =
         new BufferedReader(
           new InputStreamReader(
-            getClass().getResourceAsStream("LICENSE")));
+            getClass().getResourceAsStream("LICENSE"), StandardCharsets.UTF_8));
       System.out.println("---- FILE: LICENSE ----");
 
       String s;
@@ -37,7 +38,7 @@ class DisplayLicense
       in =
         new BufferedReader(
           new InputStreamReader(
-            getClass().getResourceAsStream("AUTHORS")));
+            getClass().getResourceAsStream("AUTHORS"), StandardCharsets.UTF_8));
 
       while((s = in.readLine()) != null)
       {
@@ -52,7 +53,7 @@ class DisplayLicense
       in =
         new BufferedReader(
           new InputStreamReader(
-            getClass().getResourceAsStream("COPYING-LESSER")));
+            getClass().getResourceAsStream("COPYING-LESSER"), StandardCharsets.UTF_8));
 
       while((s = in.readLine()) != null)
       {
diff --git a/src/main/java/org/sablecc/sablecc/GenAlts.java b/src/main/java/org/sablecc/sablecc/GenAlts.java
index 0809c352bc8310442eec1205ab149575b204efe3..08864efe759a81602e872dfe01a14b37ab43151a 100644
--- a/src/main/java/org/sablecc/sablecc/GenAlts.java
+++ b/src/main/java/org/sablecc/sablecc/GenAlts.java
@@ -9,9 +9,10 @@ package org.sablecc.sablecc;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -37,7 +38,7 @@ public class GenAlts extends DepthFirstAdapter
     {
       macros = new MacroExpander(
                  new InputStreamReader(
-                   getClass().getResourceAsStream("alternatives.txt")));
+                   getClass().getResourceAsStream("alternatives.txt"), StandardCharsets.UTF_8));
     }
     catch(IOException e)
     {
@@ -112,7 +113,7 @@ public class GenAlts extends DepthFirstAdapter
   {
     String name = ast_ids.ast_names.get(node);
 
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, name + ".java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, name + ".java").toPath(), StandardCharsets.UTF_8))
     {
         boolean hasOperator = false;
         boolean hasList = false;
diff --git a/src/main/java/org/sablecc/sablecc/GenAnalyses.java b/src/main/java/org/sablecc/sablecc/GenAnalyses.java
index 45682f157979415102f0c9c96a39b57d0c1a1cc8..f56b61eeaab136193646d12d4b66e8e0b5c37dfc 100644
--- a/src/main/java/org/sablecc/sablecc/GenAnalyses.java
+++ b/src/main/java/org/sablecc/sablecc/GenAnalyses.java
@@ -9,9 +9,10 @@ package org.sablecc.sablecc;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
@@ -39,7 +40,7 @@ public class GenAnalyses extends DepthFirstAdapter
     {
       macros = new MacroExpander(
                  new InputStreamReader(
-                   getClass().getResourceAsStream("analyses.txt")));
+                   getClass().getResourceAsStream("analyses.txt"), StandardCharsets.UTF_8));
     }
     catch(IOException e)
     {
@@ -148,7 +149,7 @@ public class GenAnalyses extends DepthFirstAdapter
 
   public void createAnalysis()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "Analysis.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "Analysis.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "AnalysisHeader", new String[] {ast_ids.astIds.pkgNameDot});
 
@@ -182,7 +183,7 @@ public class GenAnalyses extends DepthFirstAdapter
 
   public void createAnalysisAdapter()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "AnalysisAdapter.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "AnalysisAdapter.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "AnalysisAdapterHeader", new String[] {ast_ids.astIds.pkgNameDot});
 
@@ -214,7 +215,7 @@ public class GenAnalyses extends DepthFirstAdapter
 
   public void createDepthFirstAdapter()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "DepthFirstAdapter.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "DepthFirstAdapter.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "DepthFirstAdapterHeader", new String[] {ast_ids.astIds.pkgNameDot, mainProduction});
 
@@ -263,7 +264,7 @@ public class GenAnalyses extends DepthFirstAdapter
 
   public void createReversedDepthFirstAdapter()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "ReversedDepthFirstAdapter.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "ReversedDepthFirstAdapter.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "ReversedDepthFirstAdapterHeader", new String[] {ast_ids.astIds.pkgNameDot, mainProduction});
 
diff --git a/src/main/java/org/sablecc/sablecc/GenLexer.java b/src/main/java/org/sablecc/sablecc/GenLexer.java
index 8e9105b629a4ca43d8856dd8c01b1db2a8aea0cc..d4b8e53c17623bc604ce6be1211e33992128fd30 100644
--- a/src/main/java/org/sablecc/sablecc/GenLexer.java
+++ b/src/main/java/org/sablecc/sablecc/GenLexer.java
@@ -12,9 +12,10 @@ import java.io.BufferedWriter;
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -41,7 +42,7 @@ public class GenLexer extends AnalysisAdapter
     {
       macros = new MacroExpander(
                  new InputStreamReader(
-                   getClass().getResourceAsStream("lexer.txt")));
+                   getClass().getResourceAsStream("lexer.txt"), StandardCharsets.UTF_8));
     }
     catch(IOException e)
     {
@@ -111,7 +112,7 @@ public class GenLexer extends AnalysisAdapter
 
   private void createLexerException()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "LexerException.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "LexerException.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "LexerException", new String[] {ids.pkgNameDot});
     }
@@ -124,7 +125,7 @@ public class GenLexer extends AnalysisAdapter
 
   private void createLexer()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "Lexer.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "Lexer.java").toPath(), StandardCharsets.UTF_8))
     {
       String startState = "INITIAL";
       if(ids.stateList.size() > 0)
diff --git a/src/main/java/org/sablecc/sablecc/GenParser.java b/src/main/java/org/sablecc/sablecc/GenParser.java
index b29b93bc4298f59ae7ab786993e488bcb8b13559..20592f25f0f079a03a58815281950c9aa3c77683 100644
--- a/src/main/java/org/sablecc/sablecc/GenParser.java
+++ b/src/main/java/org/sablecc/sablecc/GenParser.java
@@ -12,9 +12,10 @@ import java.io.BufferedWriter;
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Deque;
 import java.util.HashMap;
@@ -107,7 +108,7 @@ public class GenParser extends DepthFirstAdapter
     {
       macros = new MacroExpander(
                  new InputStreamReader(
-                   getClass().getResourceAsStream("parser.txt")));
+                   getClass().getResourceAsStream("parser.txt"), StandardCharsets.UTF_8));
     }
     catch(IOException e)
     {
@@ -366,7 +367,7 @@ public class GenParser extends DepthFirstAdapter
   //Parser.java Generation
   private void createParser()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "Parser.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "Parser.java").toPath(), StandardCharsets.UTF_8))
     {
       Symbol[] terminals = Symbol.terminals();
       Symbol[] nonterminals = Symbol.nonterminals();
@@ -726,7 +727,7 @@ public class GenParser extends DepthFirstAdapter
 
   private void createTokenIndex()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "TokenIndex.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "TokenIndex.java").toPath(), StandardCharsets.UTF_8))
     {
       Symbol[] terminals = Symbol.terminals();
 
@@ -748,7 +749,7 @@ public class GenParser extends DepthFirstAdapter
 
   private void createParserException()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "ParserException.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "ParserException.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "ParserException", new String[] {ids.pkgNameDot});
     }
@@ -761,7 +762,7 @@ public class GenParser extends DepthFirstAdapter
 
   private void createState()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "State.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "State.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "State", new String[] {ids.pkgNameDot});
     }
diff --git a/src/main/java/org/sablecc/sablecc/GenProds.java b/src/main/java/org/sablecc/sablecc/GenProds.java
index a5da4d61a23ba232ee859272487c1ef0425bdf7c..aea041b29cf99fd7c825a6284be63219039d3d88 100644
--- a/src/main/java/org/sablecc/sablecc/GenProds.java
+++ b/src/main/java/org/sablecc/sablecc/GenProds.java
@@ -9,9 +9,10 @@ package org.sablecc.sablecc;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 
 import org.sablecc.sablecc.analysis.DepthFirstAdapter;
 import org.sablecc.sablecc.node.AAstProd;
@@ -30,7 +31,7 @@ public class GenProds extends DepthFirstAdapter
     {
       macros = new MacroExpander(
                  new InputStreamReader(
-                   getClass().getResourceAsStream("productions.txt")));
+                   getClass().getResourceAsStream("productions.txt"), StandardCharsets.UTF_8));
     }
     catch(IOException e)
     {
@@ -58,7 +59,7 @@ public class GenProds extends DepthFirstAdapter
 
   private void createProduction(String name)
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, name + ".java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, name + ".java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "Production", new String[] {ast_ids.astIds.pkgNameDot, name});
     }
@@ -71,7 +72,7 @@ public class GenProds extends DepthFirstAdapter
 
   private void createAlternative(String name, String macro, String[] arg)
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, name + ".java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, name + ".java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, macro, arg);
     }
diff --git a/src/main/java/org/sablecc/sablecc/GenTokens.java b/src/main/java/org/sablecc/sablecc/GenTokens.java
index 28e1eaf9513dbbc527f17e87a83efcbc153ddf2f..eac602079953729a7c63e1c884e295628761d4c7 100644
--- a/src/main/java/org/sablecc/sablecc/GenTokens.java
+++ b/src/main/java/org/sablecc/sablecc/GenTokens.java
@@ -9,9 +9,10 @@ package org.sablecc.sablecc;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.List;
 
 import org.sablecc.sablecc.analysis.DepthFirstAdapter;
@@ -34,7 +35,7 @@ public class GenTokens extends DepthFirstAdapter
     {
       macros = new MacroExpander(
                  new InputStreamReader(
-                   getClass().getResourceAsStream("tokens.txt")));
+                   getClass().getResourceAsStream("tokens.txt"), StandardCharsets.UTF_8));
     }
     catch(IOException e)
     {
@@ -93,7 +94,7 @@ public class GenTokens extends DepthFirstAdapter
       }
     }
 
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, name + ".java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, name + ".java").toPath(), StandardCharsets.UTF_8))
     {
       if(text == null)
       {
diff --git a/src/main/java/org/sablecc/sablecc/GenUtils.java b/src/main/java/org/sablecc/sablecc/GenUtils.java
index 49310818d7fe080756362098a7ebd59bf4729a42..10eed4536850326d0c2ea22ecca92c5398b11c83 100644
--- a/src/main/java/org/sablecc/sablecc/GenUtils.java
+++ b/src/main/java/org/sablecc/sablecc/GenUtils.java
@@ -9,9 +9,10 @@ package org.sablecc.sablecc;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 
 import org.sablecc.sablecc.analysis.DepthFirstAdapter;
 import org.sablecc.sablecc.node.AAstProd;
@@ -32,7 +33,7 @@ public class GenUtils extends DepthFirstAdapter
     {
       macros = new MacroExpander(
                  new InputStreamReader(
-                   getClass().getResourceAsStream("utils.txt")));
+                   getClass().getResourceAsStream("utils.txt"), StandardCharsets.UTF_8));
     }
     catch(IOException e)
     {
@@ -88,7 +89,7 @@ public class GenUtils extends DepthFirstAdapter
 
   public void createStart()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "Start.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "Start.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "Start", new String[] {ast_ids.astIds.pkgNameDot, mainProduction, GenAlts.nodeName(mainProduction)});
     }
@@ -101,7 +102,7 @@ public class GenUtils extends DepthFirstAdapter
 
   public void createEOF()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "EOF.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "EOF.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "EOF", new String[] {ast_ids.astIds.pkgNameDot});
     }
@@ -114,7 +115,7 @@ public class GenUtils extends DepthFirstAdapter
 
   public void createNode()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "Node.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "Node.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "Node", new String[] {ast_ids.astIds.pkgNameDot});
     }
@@ -127,7 +128,7 @@ public class GenUtils extends DepthFirstAdapter
 
   public void createToken()
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, "Token.java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, "Token.java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, "Token", new String[] {ast_ids.astIds.pkgNameDot});
     }
@@ -140,7 +141,7 @@ public class GenUtils extends DepthFirstAdapter
 
   public void create(String cls)
   {
-    try(BufferedWriter file = new BufferedWriter(new FileWriter(new File(pkgDir, cls + ".java"))))
+    try(BufferedWriter file = Files.newBufferedWriter(new File(pkgDir, cls + ".java").toPath(), StandardCharsets.UTF_8))
     {
       macros.apply(file, cls, new String[] {ast_ids.astIds.pkgNameDot});
     }
diff --git a/src/main/java/org/sablecc/sablecc/SableCC.java b/src/main/java/org/sablecc/sablecc/SableCC.java
index 2ed2bb3e4b9a89799401c4688217bc4d3f1f11b7..be66d8924e2b682897ad3c72e2e2fd6b5214631a 100644
--- a/src/main/java/org/sablecc/sablecc/SableCC.java
+++ b/src/main/java/org/sablecc/sablecc/SableCC.java
@@ -7,10 +7,12 @@
 
 package org.sablecc.sablecc;
 
+import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileReader;
 import java.io.IOException;
 import java.io.PushbackReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -186,13 +188,14 @@ public class SableCC {
     System.out.println("\n -- Generating parser for " + in.getName()
         + " in " + dir.getPath());
 
-    FileReader temp = new FileReader(in);
-
     // Build the AST
-    Start tree = new Parser(new Lexer(new PushbackReader(
-        temp = new FileReader(in), 1000))).parse();
-
-    temp.close();
+    Start tree;
+    try (
+      BufferedReader temp = Files.newBufferedReader(in.toPath(), StandardCharsets.UTF_8);
+      PushbackReader reader = new PushbackReader(temp, 1000);
+    ) {
+      tree = new Parser(new Lexer(reader)).parse();
+    }
 
     boolean hasTransformations = false;