HTMLのエンコードやデコードなどは、.NETに正規のライブラリが存在します。
これらは自作のものとは比べ物にもならない高い精度を誇ると言えるでしょう。
以下のものを「encdecform.mac」として保存してみましょう。
#PY = loaddll( hidemarudir + "\\" + "hmPy.dll" ); #_ = dllfuncw(#PY, "DoString", R"IPY( filename = hm.Macro.Var["filename"] encoding = hm.Macro.Var["codepage"] )IPY" ); #_ = dllfuncw(#PY, "DoString", R"IPY( import clr clr.AddReference("System.Windows.Forms") clr.AddReference("System.Web") clr.AddReference("System.Drawing") import System import System.IO import System.Windows.Forms from System.Windows.Forms import * from System.Web import HttpUtility from System.Drawing import * from System import * from System.IO import * def FileReadToEnd(): text = "" sr = None try: sr = StreamReader(filename, System.Text.Encoding.GetEncoding(encoding)); text = sr.ReadToEnd(); sr.Close(); except Exception as e: hm.debuginfo(e) finally: if sr: sr.Close() return text strOrgText = FileReadToEnd() strDstText = "" class EncodeDecodeFrom(Form): def __init__(self): self.InitializeComponent() def InitializeComponent(self): global strOrgText self._textBoxInput = TextBox() self._textBoxOutput = TextBox() self._groupBoxType = GroupBox() self._radioButtonDecode = RadioButton() self._radioButtonEncode = RadioButton() self._checkBoxCopy = CheckBox() self._buttonAction = Button() self._groupBoxType.SuspendLayout() self.SuspendLayout() # # _textBoxInput # self._textBoxInput.Font = Font("Consolas", 10.5, FontStyle.Regular, GraphicsUnit.Point, 0) self._textBoxInput.Location = Point(12, 12) self._textBoxInput.Multiline = True self._textBoxInput.Name = "textBoxInput" self._textBoxInput.ScrollBars = ScrollBars.Both self._textBoxInput.Size = Size(380, 103) self._textBoxInput.TabIndex = 0 self._textBoxInput.Text = strOrgText # # _textBoxOutput # self._textBoxOutput.Font = Font("Consolas", 10.5, FontStyle.Regular, GraphicsUnit.Point, 0) self._textBoxOutput.Location = Point(12, 125) self._textBoxOutput.Multiline = True self._textBoxOutput.Name = "textBoxOutput" self._textBoxOutput.ReadOnly = True self._textBoxOutput.ScrollBars = ScrollBars.Both self._textBoxOutput.Size = Size(380, 103) self._textBoxOutput.TabIndex = 1 # # _groupBoxType # self._groupBoxType.Controls.Add(self._radioButtonEncode) self._groupBoxType.Controls.Add(self._radioButtonDecode) self._groupBoxType.FlatStyle = FlatStyle.System self._groupBoxType.Location = Point(12, 234) self._groupBoxType.Name = "groupBoxType" self._groupBoxType.Size = Size(168, 51) self._groupBoxType.TabIndex = 2 self._groupBoxType.TabStop = False self._groupBoxType.Text = "Type" # # _radioButtonDecode # self._radioButtonDecode.AutoSize = True self._radioButtonDecode.FlatStyle = FlatStyle.System self._radioButtonDecode.Location = Point(18, 19) self._radioButtonDecode.Name = "radioButtonDecode" self._radioButtonDecode.Size = Size(69, 18) self._radioButtonDecode.TabIndex = 0 self._radioButtonDecode.Text = "デコード" self._radioButtonDecode.UseVisualStyleBackColor = True self._radioButtonDecode.CheckedChanged += self.radioButtonType_CheckedChanged # # _radioButtonEncode # self._radioButtonEncode.AutoSize = True self._radioButtonEncode.Checked = True self._radioButtonEncode.FlatStyle = FlatStyle.System self._radioButtonEncode.Location = Point(93, 19) self._radioButtonEncode.Name = "radioButtonEncode" self._radioButtonEncode.Size = Size(68, 18) self._radioButtonEncode.TabIndex = 1 self._radioButtonEncode.TabStop = True self._radioButtonEncode.Text = "エンコード" self._radioButtonEncode.UseVisualStyleBackColor = True self._radioButtonEncode.CheckedChanged += self.radioButtonType_CheckedChanged # # _checkBoxCopy # self._checkBoxCopy.AutoSize = True self._checkBoxCopy.Checked = True self._checkBoxCopy.CheckState = CheckState.Checked self._checkBoxCopy.FlatStyle = FlatStyle.System self._checkBoxCopy.Location = Point(186, 254) self._checkBoxCopy.Name = "checkBoxCopy" self._checkBoxCopy.Size = Size(115, 18) self._checkBoxCopy.TabIndex = 3 self._checkBoxCopy.Text = "クリップボードにコピー" self._checkBoxCopy.UseVisualStyleBackColor = True # # _buttonAction # self._buttonAction.FlatStyle = FlatStyle.System self._buttonAction.Location = Point(317, 250) self._buttonAction.Name = "buttonAction" self._buttonAction.Size = Size(75, 23) self._buttonAction.TabIndex = 4 self._buttonAction.Text = "エンコード" self._buttonAction.UseVisualStyleBackColor = True self._buttonAction.Click += self.buttonAction_Click # # FormMain # self.AcceptButton = self._buttonAction; self.AutoScaleDimensions = SizeF(6.0, 13.0) self.AutoScaleMode = AutoScaleMode.Font self.ClientSize = Size(406, 299) self.Controls.Add(self._buttonAction) self.Controls.Add(self._checkBoxCopy) self.Controls.Add(self._groupBoxType) self.Controls.Add(self._textBoxOutput) self.Controls.Add(self._textBoxInput) self.FormBorderStyle = FormBorderStyle.FixedDialog; self.MaximizeBox = False; self.Name = "エンコード・デコード・フォーム" self.StartPosition = FormStartPosition.CenterScreen; self.Text = "Html エンコード・デコード・フォーム" self._groupBoxType.ResumeLayout(False) self._groupBoxType.PerformLayout() self.ResumeLayout(False) self.PerformLayout() def radioButtonType_CheckedChanged(self, sender, e): self._buttonAction.Text = sender.Text def buttonAction_Click(self, sender, e): global strDstText actions = { True: HttpUtility.HtmlEncode, False: HttpUtility.HtmlDecode } self._textBoxOutput.Text = actions[self._radioButtonEncode.Checked](self._textBoxInput.Text) strDstText = self._textBoxOutput.Text if self._checkBoxCopy.Checked: Clipboard.SetText(self._textBoxOutput.Text) EncodeDecodeFrom().ShowDialog() )IPY" ); freedll( #PY );