Skip to content

Commit bf163ca

Browse files
committed
UTF8の対応
1 parent aea6e1f commit bf163ca

File tree

9 files changed

+166
-9
lines changed

9 files changed

+166
-9
lines changed

MachineDisplay/MachineDisplay.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
<AppDesignerFolder>Properties</AppDesignerFolder>
1010
<RootNamespace>Simulator</RootNamespace>
1111
<AssemblyName>MachineDisplay</AssemblyName>
12-
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
12+
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
1313
<FileAlignment>512</FileAlignment>
14+
<TargetFrameworkProfile />
1415
</PropertyGroup>
1516
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
1617
<DebugSymbols>true</DebugSymbols>

SimulatorCommon/Common.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<AppDesignerFolder>Properties</AppDesignerFolder>
1010
<RootNamespace>Simulator</RootNamespace>
1111
<AssemblyName>SimulatorCommon</AssemblyName>
12-
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
12+
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
1313
<FileAlignment>512</FileAlignment>
1414
<TargetFrameworkProfile />
1515
</PropertyGroup>

asc-assembler-test/asc-assembler-test.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,5 +537,43 @@ namespace ascAssemblerTest
537537
Assert::AreNotEqual(log.find(_errShortOutOfSignedRange("-32769")), std::string::npos);
538538
Assert::AreNotEqual(log.find(_errShortOutOfUnsignedRange("65538")), std::string::npos);
539539
}
540+
541+
TEST_METHOD(TestUtf8)
542+
{
543+
std::stringstream stream;
544+
stream << " TITLE TEST" << std::endl;
545+
stream << " ORG 0x000" << std::endl;
546+
stream << u8" ; テストメッセージ" << std::endl;
547+
stream << " LD 0x000" << std::endl;
548+
stream << " END" << std::endl;
549+
550+
Compiler compiler;
551+
Binary binary;
552+
553+
compiler.SetStream(&stream);
554+
std::string log = compiler.Compile(&binary);
555+
Logger::WriteMessage(log.c_str());
556+
557+
Assert::AreNotEqual(log.find("テストメッセージ"), std::string::npos);
558+
}
559+
560+
TEST_METHOD(TestSjis)
561+
{
562+
std::stringstream stream;
563+
stream << " TITLE TEST" << std::endl;
564+
stream << " ORG 0x000" << std::endl;
565+
stream << " ; テストメッセージ" << std::endl;
566+
stream << " LD 0x000" << std::endl;
567+
stream << " END" << std::endl;
568+
569+
Compiler compiler;
570+
Binary binary;
571+
572+
compiler.SetStream(&stream);
573+
std::string log = compiler.Compile(&binary);
574+
Logger::WriteMessage(log.c_str());
575+
576+
Assert::AreNotEqual(log.find("テストメッセージ"), std::string::npos);
577+
}
540578
};
541579
}

asc-assembler/asc-assembler.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
<ClInclude Include="src\core\labels.h">
5454
<Filter>Header Files</Filter>
5555
</ClInclude>
56+
<ClInclude Include="src\core\utils.h">
57+
<Filter>Header Files</Filter>
58+
</ClInclude>
5659
</ItemGroup>
5760
<ItemGroup>
5861
<None Include="test1.asm">

asc-assembler/src/core/compiler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111
#include <iomanip>
1212
#include <bitset>
1313
#include <vector>
14-
1514
#include <iostream>
1615

1716
#include "binary.h"
1817
#include "labels.h"
1918
#include "defines.h"
19+
#include "utils.h"
2020

2121
Compiler::Compiler() {
2222
this->LabelTable = Labels();
@@ -36,6 +36,7 @@ Compiler::~Compiler() {
3636

3737
void Compiler::SetStream(std::istream* stream) {
3838
this->_Buffer = static_cast<std::stringstream const&>(std::stringstream() << stream->rdbuf()).str();
39+
this->_Buffer = convertToSjis(this->_Buffer);
3940

4041
this->_isFileLoaded = true;
4142
}

asc-assembler/src/core/utils.h

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#pragma once
2+
3+
#include <string>
4+
#include <unicode/ucsdet.h>
5+
#include <unicode/ucnv.h>
6+
7+
std::string convertToSjis(std::string src) {
8+
auto error = U_ZERO_ERROR;
9+
auto detector = ucsdet_open(&error);
10+
11+
if (U_FAILURE(error)) {
12+
return src;
13+
}
14+
15+
ucsdet_setText(detector, src.c_str(), src.size(), &error);
16+
17+
if (U_FAILURE(error)) {
18+
ucsdet_close(detector);
19+
return src;
20+
}
21+
22+
auto match = ucsdet_detect(detector, &error);
23+
24+
if (U_FAILURE(error)) {
25+
ucsdet_close(detector);
26+
return src;
27+
}
28+
29+
auto name = ucsdet_getName(match, &error);
30+
31+
if (U_FAILURE(error)) {
32+
ucsdet_close(detector);
33+
return src;
34+
}
35+
36+
ucsdet_close(detector);
37+
38+
// 誤検知による文字化けを防ぐため、SJISとUTF8のみ対応
39+
if (strcmp(name, "UTF-8") != 0) {
40+
return src;
41+
}
42+
auto toConverter = ucnv_open("MS932", &error);
43+
44+
if (U_FAILURE(error)) {
45+
return src;
46+
}
47+
48+
auto fromConverter = ucnv_open(name, &error);
49+
50+
if (U_FAILURE(error)) {
51+
ucnv_close(toConverter);
52+
return src;
53+
}
54+
55+
// 大きいが十分
56+
auto internalMaxLen = ucnv_getMaxCharSize(fromConverter) * src.size();
57+
auto internalBuffer = (UChar*)malloc(sizeof(UChar) * internalMaxLen);
58+
59+
if (internalBuffer == nullptr) {
60+
ucnv_close(toConverter);
61+
ucnv_close(fromConverter);
62+
return src;
63+
}
64+
65+
auto len = ucnv_toUChars(
66+
fromConverter,
67+
internalBuffer,
68+
internalMaxLen,
69+
src.c_str(),
70+
src.size(),
71+
&error
72+
);
73+
74+
if (U_FAILURE(error)) {
75+
free(internalBuffer);
76+
ucnv_close(toConverter);
77+
ucnv_close(fromConverter);
78+
return src;
79+
}
80+
81+
auto resultMaxLen = ucnv_getMaxCharSize(toConverter) * len;
82+
auto resultBuffer = (char*)malloc(sizeof(char) * resultMaxLen);
83+
84+
if (resultBuffer == nullptr) {
85+
free(internalBuffer);
86+
ucnv_close(toConverter);
87+
ucnv_close(fromConverter);
88+
return src;
89+
}
90+
91+
auto result = ucnv_fromUChars(
92+
toConverter,
93+
resultBuffer,
94+
resultMaxLen,
95+
internalBuffer,
96+
len,
97+
&error
98+
);
99+
100+
if (U_FAILURE(error)) {
101+
free(internalBuffer);
102+
ucnv_close(toConverter);
103+
ucnv_close(fromConverter);
104+
return src;
105+
}
106+
107+
auto dest = std::string(resultBuffer);
108+
109+
free(internalBuffer);
110+
ucnv_close(toConverter);
111+
ucnv_close(fromConverter);
112+
113+
return dest;
114+
}

asc-simulator/App.config

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<startup>
4-
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
4+
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
55
</startup>
66
<runtime>
77
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
8-
<probing privatePath="lib" />
8+
<probing privatePath="lib"/>
99
</assemblyBinding>
1010
</runtime>
1111
</configuration>

asc-simulator/Properties/Resources.Designer.cs

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

asc-simulator/asc-simulator.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<AppDesignerFolder>Properties</AppDesignerFolder>
1010
<RootNamespace>Simulator</RootNamespace>
1111
<AssemblyName>asc-simulator</AssemblyName>
12-
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
12+
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
1313
<FileAlignment>512</FileAlignment>
1414
<TargetFrameworkProfile />
1515
<IsWebBootstrapper>false</IsWebBootstrapper>

0 commit comments

Comments
 (0)