diff --git a/src/DHTConnection.h b/src/DHTConnection.h
index e269794d..cd718a74 100644
--- a/src/DHTConnection.h
+++ b/src/DHTConnection.h
@@ -36,6 +36,7 @@
 #define D_DHT_CONNECTION_H
 
 #include "common.h"
+#include <sys/types.h>
 #include <string>
 
 namespace aria2 {
diff --git a/src/json.cc b/src/json.cc
index 9094bcbb..81341ee6 100644
--- a/src/json.cc
+++ b/src/json.cc
@@ -159,11 +159,13 @@ decodeString(InputIterator first, InputIterator last)
         checkEof(first, last);
         uint16_t codepoint = util::parseUInt(std::string(uchars, first), 16);
         if(codepoint <= 0x007fu) {
-          unsigned char temp[1] = { static_cast<char>(codepoint) };
+          unsigned char temp[1];
+          temp[0] = static_cast<char>(codepoint);
           s.append(&temp[0], &temp[sizeof(temp)]);
         } else if(codepoint <= 0x07ffu) {
-          unsigned char temp[2] = { 0xC0u | (codepoint >> 6),
-                                    0x80u | (codepoint & 0x003fu) };
+          unsigned char temp[2];
+          temp[0] = 0xC0u | (codepoint >> 6);
+          temp[1] = 0x80u | (codepoint & 0x003fu);
           s.append(&temp[0], &temp[sizeof(temp)]);
         } else if(in(codepoint, 0xD800u, 0xDBFFu)) {
           // surrogate pair
@@ -186,15 +188,17 @@ decodeString(InputIterator first, InputIterator last)
           uint32_t fullcodepoint = 0x010000u;
           fullcodepoint += (codepoint & 0x03FFu) << 10;
           fullcodepoint += (codepoint2 & 0x03FFu);
-          unsigned char temp[4] = { 0xf0u | (fullcodepoint >> 18),
-                                    0x80u | ((fullcodepoint >> 12) & 0x003Fu),
-                                    0x80u | ((fullcodepoint >> 6) & 0x003Fu),
-                                    0x80u | (fullcodepoint & 0x003Fu) };
+          unsigned char temp[4];
+          temp[0] = 0xf0u | (fullcodepoint >> 18);
+          temp[1] = 0x80u | ((fullcodepoint >> 12) & 0x003Fu);
+          temp[2] = 0x80u | ((fullcodepoint >> 6) & 0x003Fu);
+          temp[3] = 0x80u | (fullcodepoint & 0x003Fu);
           s.append(&temp[0], &temp[sizeof(temp)]);
         } else {
-          unsigned char temp[3] = { 0xE0u | (codepoint >> 12),
-                                    0x80u | ((codepoint >> 6) & 0x003Fu),
-                                    0x80u | (codepoint & 0x003Fu) };
+          unsigned char temp[3];
+          temp[0] = 0xE0u | (codepoint >> 12);
+          temp[1] = 0x80u | ((codepoint >> 6) & 0x003Fu);
+          temp[2] = 0x80u | (codepoint & 0x003Fu);
           s.append(&temp[0], &temp[sizeof(temp)]);
         }
         offset = first;
diff --git a/test/DefaultExtensionMessageFactoryTest.cc b/test/DefaultExtensionMessageFactoryTest.cc
index cad5037b..81de2036 100644
--- a/test/DefaultExtensionMessageFactoryTest.cc
+++ b/test/DefaultExtensionMessageFactoryTest.cc
@@ -78,7 +78,7 @@ public:
 
   std::string getExtensionMessageID(const std::string& name)
   {
-    char id[1] = { registry_->getExtensionMessageID(name) };
+    unsigned char id[1] = { registry_->getExtensionMessageID(name) };
     return std::string(&id[0], &id[1]);
   }
 
@@ -105,7 +105,7 @@ void DefaultExtensionMessageFactoryTest::testCreateMessage_unknown()
 {
   peer_->setExtension("foo", 255);
 
-  char id[1] = { 255 };
+  unsigned char id[1] = { 255 };
 
   std::string data = std::string(&id[0], &id[1]);
   try {
diff --git a/test/JsonTest.cc b/test/JsonTest.cc
index 7810724d..79e4a5d8 100644
--- a/test/JsonTest.cc
+++ b/test/JsonTest.cc
@@ -100,7 +100,7 @@ void JsonTest::testDecode()
     const List* list = downcast<List>(r);
     CPPUNIT_ASSERT(list);
     const String* s = downcast<String>(list->get(0));
-    const char arr[] = { 0xF0u, 0xA4u, 0xADu, 0xA2u };
+    const unsigned char arr[] = { 0xF0u, 0xA4u, 0xADu, 0xA2u };
     CPPUNIT_ASSERT_EQUAL(std::string(vbegin(arr), vend(arr)), s->s());
   }
   {