From 91404a5f77f70dadb64dfe61b709e2a188abf680 Mon Sep 17 00:00:00 2001
From: Syping <schiedelrafael@keppe.org>
Date: Wed, 28 Dec 2022 05:56:01 +0100
Subject: [PATCH] CMake: improved Unicode tests

unicode.cmake: avoid errors when spaces exists
CodecvtTest.cpp: add Japanese, Korean, Russian and Taiwanese tests
WincvtTest.cpp: add Japanese, Korean, Russian and Taiwanese tests
---
 cmake/unicode.cmake   |   6 +-
 tests/CodecvtTest.cpp | 186 +++++++++++++++++++++++++++++++++++++++--
 tests/WincvtTest.cpp  | 188 ++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 364 insertions(+), 16 deletions(-)

diff --git a/cmake/unicode.cmake b/cmake/unicode.cmake
index 77b2629..7058aec 100644
--- a/cmake/unicode.cmake
+++ b/cmake/unicode.cmake
@@ -26,7 +26,7 @@ if (RAGEPHOTO_UNICODE)
 else()
     # RagePhoto Unicode functionality tests
     message("-- Testing codecvt")
-    try_run(CODECVT_RUN CODECVT_COMPILE ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/tests/CodecvtTest.cpp)
+    try_run(CODECVT_RUN CODECVT_COMPILE "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/tests/CodecvtTest.cpp")
     if (CODECVT_COMPILE AND CODECVT_RUN EQUAL 0)
         set(CODECVT_COMPAT TRUE)
         message("-- Testing codecvt - yes")
@@ -35,7 +35,7 @@ else()
     endif()
     
     message("-- Testing iconv")
-    try_run(ICONV_RUN ICONV_COMPILE ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/tests/IconvTest.cpp)
+    try_run(ICONV_RUN ICONV_COMPILE "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/tests/IconvTest.cpp")
     if (ICONV_COMPILE AND ICONV_RUN EQUAL 0)
         set(ICONV_COMPAT TRUE)
         message("-- Testing iconv - yes")
@@ -45,7 +45,7 @@ else()
     
     if (WIN32)
         message("-- Testing wincvt")
-        try_run(WINCVT_RUN WINCVT_COMPILE ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/tests/WincvtTest.cpp)
+        try_run(WINCVT_RUN WINCVT_COMPILE "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/tests/WincvtTest.cpp")
         if (WINCVT_COMPILE AND WINCVT_RUN EQUAL 0)
             set(WINCVT_COMPAT TRUE)
             message("-- Testing wincvt - yes")
diff --git a/tests/CodecvtTest.cpp b/tests/CodecvtTest.cpp
index bee6052..13c808a 100644
--- a/tests/CodecvtTest.cpp
+++ b/tests/CodecvtTest.cpp
@@ -23,7 +23,7 @@
 
 int main(int argc, char *argv[])
 {
-    char photoHeader[256] = {
+    const unsigned char photoHeader_english[256] = {
         0x50, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x54, 0x00,
         0x4f, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x20, 0x00,
         0x30, 0x00, 0x32, 0x00, 0x2f, 0x00, 0x30, 0x00,
@@ -57,10 +57,184 @@ int main(int argc, char *argv[])
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     };
+
+    const unsigned char photoHeader_japanese[256] = {
+        0x99, 0x51, 0x1f, 0x77, 0x20, 0x00, 0x2d, 0x00,
+        0x20, 0x00, 0x31, 0x00, 0x32, 0x00, 0x2f, 0x00,
+        0x32, 0x00, 0x38, 0x00, 0x2f, 0x00, 0x32, 0x00,
+        0x32, 0x00, 0x20, 0x00, 0x30, 0x00, 0x34, 0x00,
+        0x3a, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3a, 0x00,
+        0x35, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
+    const unsigned char photoHeader_korean[256] = {
+        0xac, 0xc0, 0xc4, 0xc9, 0x20, 0x00, 0x2d, 0x00,
+        0x20, 0x00, 0x31, 0x00, 0x32, 0x00, 0x2f, 0x00,
+        0x32, 0x00, 0x38, 0x00, 0x2f, 0x00, 0x32, 0x00,
+        0x32, 0x00, 0x20, 0x00, 0x30, 0x00, 0x34, 0x00,
+        0x3a, 0x00, 0x31, 0x00, 0x38, 0x00, 0x3a, 0x00,
+        0x32, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
+    const unsigned char photoHeader_russian[256] = {
+        0x24, 0x04, 0x1e, 0x04, 0x22, 0x04, 0x1e, 0x04,
+        0x20, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x31, 0x00,
+        0x32, 0x00, 0x2f, 0x00, 0x32, 0x00, 0x38, 0x00,
+        0x2f, 0x00, 0x32, 0x00, 0x32, 0x00, 0x20, 0x00,
+        0x30, 0x00, 0x34, 0x00, 0x3a, 0x00, 0x32, 0x00,
+        0x35, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x30, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
+    const unsigned char photoHeader_taiwanese[256] = {
+        0xf8, 0x76, 0x47, 0x72, 0x20, 0x00, 0x2d, 0x00,
+        0x20, 0x00, 0x31, 0x00, 0x32, 0x00, 0x2f, 0x00,
+        0x32, 0x00, 0x38, 0x00, 0x2f, 0x00, 0x32, 0x00,
+        0x32, 0x00, 0x20, 0x00, 0x30, 0x00, 0x34, 0x00,
+        0x3a, 0x00, 0x32, 0x00, 0x31, 0x00, 0x3a, 0x00,
+        0x30, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
     std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert;
-    std::string photoString = convert.to_bytes(reinterpret_cast<char16_t*>(photoHeader));
-    if (convert.converted() == 0) {
-        return -1;
-    }
-    return strcmp(photoString.c_str(), "PHOTO - 02/01/17 08:42:44");
+    std::string photoString;
+    
+    // English
+    photoString = convert.to_bytes(reinterpret_cast<const char16_t*>(photoHeader_english));
+    if (convert.converted() == 0)
+        return 1;
+    if (strcmp(photoString.c_str(), "PHOTO - 02/01/17 08:42:44") != 0)
+        return 2;
+    
+    // Japanese
+    photoString = convert.to_bytes(reinterpret_cast<const char16_t*>(photoHeader_japanese));
+    if (convert.converted() == 0)
+        return 3;
+    if (strcmp(photoString.c_str(), "写真 - 12/28/22 04:22:57") != 0)
+        return 4;
+
+    // Korean
+    photoString = convert.to_bytes(reinterpret_cast<const char16_t*>(photoHeader_korean));
+    if (convert.converted() == 0)
+        return 4;
+    if (strcmp(photoString.c_str(), "사진 - 12/28/22 04:18:28") != 0)
+        return 5;
+
+    // Russian
+    photoString = convert.to_bytes(reinterpret_cast<const char16_t*>(photoHeader_russian));
+    if (convert.converted() == 0)
+        return 6;
+    if (strcmp(photoString.c_str(), "ФОТО - 12/28/22 04:25:10") != 0)
+        return 7;
+
+    // Taiwanese
+    photoString = convert.to_bytes(reinterpret_cast<const char16_t*>(photoHeader_taiwanese));
+    if (convert.converted() == 0)
+        return 8;
+    if (strcmp(photoString.c_str(), "相片 - 12/28/22 04:21:01") != 0)
+        return 9;
+    
+    return 0;
 }
diff --git a/tests/WincvtTest.cpp b/tests/WincvtTest.cpp
index cd816ce..e321538 100644
--- a/tests/WincvtTest.cpp
+++ b/tests/WincvtTest.cpp
@@ -22,7 +22,7 @@
 
 int main(int argc, char *argv[])
 {
-    char photoHeader[256] = {
+    const unsigned char photoHeader_english[256] = {
         0x50, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x54, 0x00,
         0x4f, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x20, 0x00,
         0x30, 0x00, 0x32, 0x00, 0x2f, 0x00, 0x30, 0x00,
@@ -56,10 +56,184 @@ int main(int argc, char *argv[])
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     };
-    char photoHeader_string[256];
-    const int converted = WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast<wchar_t*>(photoHeader), -1, photoHeader_string, 256, NULL, NULL);
-    if (converted == 0) {
-        return -1;
-    }
-    return strcmp(photoHeader_string, "PHOTO - 02/01/17 08:42:44");
+
+    const unsigned char photoHeader_japanese[256] = {
+        0x99, 0x51, 0x1f, 0x77, 0x20, 0x00, 0x2d, 0x00,
+        0x20, 0x00, 0x31, 0x00, 0x32, 0x00, 0x2f, 0x00,
+        0x32, 0x00, 0x38, 0x00, 0x2f, 0x00, 0x32, 0x00,
+        0x32, 0x00, 0x20, 0x00, 0x30, 0x00, 0x34, 0x00,
+        0x3a, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3a, 0x00,
+        0x35, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
+    const unsigned char photoHeader_korean[256] = {
+        0xac, 0xc0, 0xc4, 0xc9, 0x20, 0x00, 0x2d, 0x00,
+        0x20, 0x00, 0x31, 0x00, 0x32, 0x00, 0x2f, 0x00,
+        0x32, 0x00, 0x38, 0x00, 0x2f, 0x00, 0x32, 0x00,
+        0x32, 0x00, 0x20, 0x00, 0x30, 0x00, 0x34, 0x00,
+        0x3a, 0x00, 0x31, 0x00, 0x38, 0x00, 0x3a, 0x00,
+        0x32, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
+    const unsigned char photoHeader_russian[256] = {
+        0x24, 0x04, 0x1e, 0x04, 0x22, 0x04, 0x1e, 0x04,
+        0x20, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x31, 0x00,
+        0x32, 0x00, 0x2f, 0x00, 0x32, 0x00, 0x38, 0x00,
+        0x2f, 0x00, 0x32, 0x00, 0x32, 0x00, 0x20, 0x00,
+        0x30, 0x00, 0x34, 0x00, 0x3a, 0x00, 0x32, 0x00,
+        0x35, 0x00, 0x3a, 0x00, 0x31, 0x00, 0x30, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
+    const unsigned char photoHeader_taiwanese[256] = {
+        0xf8, 0x76, 0x47, 0x72, 0x20, 0x00, 0x2d, 0x00,
+        0x20, 0x00, 0x31, 0x00, 0x32, 0x00, 0x2f, 0x00,
+        0x32, 0x00, 0x38, 0x00, 0x2f, 0x00, 0x32, 0x00,
+        0x32, 0x00, 0x20, 0x00, 0x30, 0x00, 0x34, 0x00,
+        0x3a, 0x00, 0x32, 0x00, 0x31, 0x00, 0x3a, 0x00,
+        0x30, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    };
+
+    int converted;
+    char photoString[256];
+
+    // English
+    converted = WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast<const wchar_t*>(photoHeader_english), -1, photoString, 256, NULL, NULL);
+    if (converted == 0)
+        return 1;
+    if (strcmp(photoString, "PHOTO - 02/01/17 08:42:44") != 0)
+        return 2;
+
+    // Japanese
+    converted = WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast<const wchar_t*>(photoHeader_japanese), -1, photoString, 256, NULL, NULL);
+    if (converted == 0)
+        return 2;
+    if (strcmp(photoString, "写真 - 12/28/22 04:22:57") != 0)
+        return 3;
+
+    // Korean
+    converted = WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast<const wchar_t*>(photoHeader_korean), -1, photoString, 256, NULL, NULL);
+    if (converted == 0)
+        return 4;
+    if (strcmp(photoString, "사진 - 12/28/22 04:18:28") != 0)
+        return 5;
+
+    // Russian
+    converted = WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast<const wchar_t*>(photoHeader_russian), -1, photoString, 256, NULL, NULL);
+    if (converted == 0)
+        return 6;
+    if (strcmp(photoString, "ФОТО - 12/28/22 04:25:10") != 0)
+        return 7;
+
+    // Taiwanese
+    converted = WideCharToMultiByte(CP_UTF8, 0, reinterpret_cast<const wchar_t*>(photoHeader_taiwanese), -1, photoString, 256, NULL, NULL);
+    if (converted == 0)
+        return 8;
+    if (strcmp(photoString, "相片 - 12/28/22 04:21:01") != 0)
+        return 9;
+
+    return 0;
 }