AccessVBAでwinsockを使いWeb翻訳サーバを作った。
ブラウザでこのサーバを呼び出し、文字を送ると英和・和英の翻訳を行う・・といったものです。
<仕様>
待ち受けのポートは初期値は80番だが変更可能とした。
検索側は、ブラウザで行う、サーバ側のポートが80以外の時は、 http://サーバ名:ポート番号 で呼び出す。
翻訳テーブルは、「PrepTutorEJDIC」をAccessのテーブルに取り込んだ。(約46700語)
翻訳対象の文字が全角か半角かで和英・英和の変換を判断
英和は前方一致、和英はその文字が含まれるかで検索した。
実験結果覚書
ブラウザにデータを送るとき、VBでは問題なかったがAccessdeは文字化けが起こった、バイナリーで送ったら直った。
------------------------
ブラウザでこのサーバを呼び出し、文字を送ると英和・和英の翻訳を行う・・といったものです。
<仕様>
待ち受けのポートは初期値は80番だが変更可能とした。
検索側は、ブラウザで行う、サーバ側のポートが80以外の時は、 http://サーバ名:ポート番号 で呼び出す。
翻訳テーブルは、「PrepTutorEJDIC」をAccessのテーブルに取り込んだ。(約46700語)
翻訳対象の文字が全角か半角かで和英・英和の変換を判断
英和は前方一致、和英はその文字が含まれるかで検索した。
実験結果覚書
ブラウザにデータを送るとき、VBでは問題なかったがAccessdeは文字化けが起こった、バイナリーで送ったら直った。
------------------------
Option Compare Database Option Explicit '変数宣言を強制する Dim CpName As String Dim sendHTML As String Dim strData As String Dim Whtml As String Private Sub Form_Unload(Cancel As Integer) '閉じる時、WINSOCKを閉じる Winsock1.Close Winsock2.Close End Sub Private Sub コマンド0_Click() '終了処理 Winsock1.Close 'ネットワーク切断 Winsock2.Close DoCmd.Close Quit End Sub Private Sub コマンド16_Click() '使用ポート変更 On Error GoTo err_end: Me.テキスト11 = "" Me.テキスト1 = "" Me.テキスト2 = "" Winsock1.Close '終了処理 Winsock1.LocalPort = Me.テキスト14 '接続要求受付ポート番号設定 Winsock1.Listen '接続要求待ち Exit Sub err_end: MsgBox ("Winsock待ちエラー") Winsock1.Close End Sub Private Sub Form_Load() On Error GoTo err_end: Me.テキスト14 = 80 Winsock1.Close '終了処理 Winsock1.LocalPort = 80 '接続要求受付ポート番号設定 Winsock1.Listen '接続要求待ち 'コンピュータ名を得る Dim obj Set obj = CreateObject("WScript.Network") CpName = obj.ComputerName Me.テキスト17 = CpName 'Html Whtml = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'" Whtml = Whtml & "'http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd'>" Whtml = Whtml & "<html lang='ja'>" Whtml = Whtml & "<head>" Whtml = Whtml & "<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>" Whtml = Whtml & "<meta http-equiv='Content-Script-Type' content='text/javascript'>" Whtml = Whtml & "<meta http-equiv='Content-Style-Type' content='text/css'>" Whtml = Whtml & "<TITLE>翻訳</TITLE></HEAD><BODY><center>" Whtml = Whtml & "<FORM name='form1' action='http://" Whtml = Whtml & Me.テキスト17 Whtml = Whtml & ":" Whtml = Whtml & Me.テキスト14 Whtml = Whtml & "/' METHOD='POST'>" Whtml = Whtml & "<br><br> 英和・和英翻訳<br><br>" Exit Sub err_end: Winsock1.Close MsgBox ("Winsock待ちエラー") End Sub '------------------------------ 'ブラウザ処理 Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) 'ブラウザからWinsock1へのの接続要求があった時、 'Winsock2が閉じていなければクローズ処理を行ってから接続処理を実行 If Winsock2.State <> sckClosed Then Winsock2.Close '応答処理をWinsock2へ引き渡す Winsock2.Accept requestID 'メッセージ表示 msg_write ("Winsock1 ConnectionRequest = " & requestID) End Sub Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long) 'データ受信処理 Dim kubun As String Dim kugiri As Double 'ブラウザからのリクエスト Winsock2.GetData strData, vbString 'メッセージ表示 msg_write ("Winsock2 DataArrival = " & strData) If strData = "" Then Get_Shori msg_write ("Winsock2 DataArrival Data= なし") Exit Sub End If '通信区分を得る kugiri = InStr(1, strData, " ") If kugiri = 0 Then '大量データの場合、データが分割されて届く場合がある。 Exit Sub End If kubun = Left(strData, InStr(1, strData, " ") - 1) Select Case kubun Case "GET" Get_Shori Case "POST" POST_data Case Else Get_Shori End Select End Sub Public Sub POST_data() Dim kubun1 As Integer Dim kubun2 As Integer Dim Mword As String Dim Gword As String 'POSTデータ編集 kubun1 = InStr(1, strData, "Mword=") If kubun1 = 0 Then Mword = "" Else kubun2 = InStr(kubun1, strData, "&") If kubun2 = 0 Then Mword = Trim(Mid(strData, kubun1 + 6)) Else Mword = Trim(Mid(strData, kubun1 + 6, (kubun2 - (kubun1 + 6)))) End If End If If Mword <> "" Then 'POST文字変換 Mword = PostHenkan(Mword) 'データ検索処理 Gword = Honyaku(Mword) Me.テキスト1 = Mword Me.テキスト2 = Gword Else Gword = "わかりません" End If 'Html sendHTML = Whtml & "変換前<br><INPUT size='20' type='text' name='Mword' value='" & Mword & "'>" sendHTML = sendHTML & " <INPUT type='submit' value='送信'><br><br>" sendHTML = sendHTML & "</FORM>" sendHTML = sendHTML & "変換後<br><textarea name='Gword' cols='80' rows='20' wrap='hard'>" & Gword & "</textarea>" sendHTML = sendHTML & "</center></body></html>" 'データ編集 Dim mm_send_data As String mm_send_data = "HTTP/1.1 200 OK" & vbCrLf & _ "Connection: close" & vbCrLf & _ "Content-type: text/html" & vbCrLf & _ vbCrLf & _ "" & sendHTML & "" 'メッセージ表示 msg_write ("Winsock2 POST_Shori = " & mm_send_data) 'バイナリ変換 Dim strbuf() As Byte strbuf = StrConv(mm_send_data, vbFromUnicode) 'データ転送 Me.Winsock2.SendData strbuf End Sub Public Sub Get_Shori() '翻訳応答用メニューを返す。 'Html sendHTML = Whtml & "変換前<br><INPUT size='20' type='text' name='Mword' value=''>" sendHTML = sendHTML & " <INPUT type='submit' value='送信'><br><br>" sendHTML = sendHTML & "</FORM>" sendHTML = sendHTML & "変換後<br><textarea name='Gword' cols='80' rows='20' wrap='hard'></textarea>" sendHTML = sendHTML & "</center></body></html>" '応答データ編集 Dim mm_send_data As String mm_send_data = "HTTP/1.1 200 OK" & vbCrLf & _ "Connection: close" & vbCrLf & _ "Content-type: text/html" & vbCrLf & _ vbCrLf & _ "" & sendHTML & "" 'メッセージ表示 msg_write ("Winsock2 Get_Shori = " & mm_send_data) 'バイナリ変換 Dim strbuf() As Byte strbuf = StrConv(mm_send_data, vbFromUnicode) 'データ転送 Me.Winsock2.SendData strbuf End Sub Private Sub msg_write(wdate) 'デバック用メッセージ表示 Me.テキスト11 = Me.テキスト11 & wdate & vbCrLf Me.テキスト11 = Me.テキスト11 & "---------------------------" & vbCrLf 'テキストを最終行に位置ずける Me.テキスト11.SetFocus Me.テキスト11.SelStart = Len(Me.テキスト11) End Sub Private Sub Winsock2_SendComplete() 'データ転送終了時にクローズ処理 Winsock2.Close End Sub 'POST文字変換処理 ※省略 '------------------------------------- '翻訳処理 Function Honyaku(Hword) Dim dat As String, ans As String Dim n As Integer '英和/和英 変換 ans = Tango_chk(Hword) '翻訳結果を戻す If ans <> "" Then Honyaku = Trim(ans) Else Honyaku = "わかりません" End If End Function Function Tango_chk(dat) Dim db As Database Dim rs As Recordset Dim Tango As String Dim moji As String Set db = CurrentDb '検索文字が全角のとき、和英変換 '半角のとき、英和変換 moji = Left(dat, 1) If LenB(StrConv(moji, vbFromUnicode)) = 2 Then Set rs = db.OpenRecordset("SELECT * FROM Tango where 日本語 like '*" & dat & "*'") Else Set rs = db.OpenRecordset("SELECT * FROM Tango where 英語 like '" & dat & "*'") End If 'データが一件でもあるか Tango = "" If Not rs.EOF Then Do While Not rs.EOF Tango = Tango & rs!英語 & " : " & rs!日本語 & vbCrLf rs.MoveNext Loop End If Tango_chk = Tango '後処理 rs.Close db.Close End Function
※コメント投稿者のブログIDはブログ作成者のみに通知されます