プロが教えるわが家の防犯対策術!

Java1年目の初心者です。

質問もどのように説明していいかわからなかったので、
至らないところもあるかと思いますが、どうぞ宜しくお願いします。

JIS8の半角カナ文字をUnicodeの全角文字へ変換するロジックを考えております。
やりたいことは以下になります。

①JIS8の変換元テーブル、Unicodeの変換後テーブルをint型の配列に定義します。

//JIS8のテーブル
static final int[] JISTABLE = {0x61,0x41,0x31,0x39,0xFFb1,0xFFb2,0xFFb3,0xFFdd};
//Unicodeのテーブル(以下の文字コードはUnicodeの全角コードではありません)
satic final int[] UNICODETABLE = {0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX};

②HashMapのKeyに変換元テーブルの値、Valueに変換後テーブルの全角のコードを設定しています。
static Map<Integer,Integer> conTable = new HashMap<Integer,Integer>();
static
{
conTable.put(JISTABLE[0],UNICODETABLE[0]);
conTable.put(JISTABLE[1],UNICODETABLE[1]);
conTable.put(JISTABLE[2],UNICODETABLE[2]);
conTable.put(JISTABLE[3],UNICODETABLE[3]);
conTable.put(JISTABLE[4],UNICODETABLE[4]);
conTable.put(JISTABLE[5],UNICODETABLE[5]);
conTable.put(JISTABLE[6],UNICODETABLE[6]);
conTable.put(JISTABLE[7],UNICODETABLE[7]);
}

③指定した文字列(例えば「aA09アイウ」)を1文字毎に処理を行い、HashMapのKeyに存在したらValueの全角文字を返すということを
やりたいのですが、英数字は問題なく変換できるのですが、半角のカナがうまく変換されません(HashMapのKey値とマッチしない)
16進数で確認しても期待した文字コードになりません。

JIS8においての半角かなは何か特殊なのでしょうか?
また、どうやればKey値とマッチするようにできるのでしょうか?
ご教授いただければと思います。

A 回答 (2件)

> //JIS8のテーブル


> static final int[] JISTABLE = {0x61,0x41,0x31,0x39,0xFFb1,0xFFb2,0xFFb3,0xFFdd};

JIS8の半角カナなら、8bitのはずですが、0xFFb1 などと、16bitが混じってます。
どういうことでしょうか?
(ついでに、UnicodeのFFB1、FFB2等は半角カナではありません)

byteの配列としてJIS8を取り込んだのなら、8bitしかないJIS8の文字が 32bitの 0xffb1 と一致するはずがありません。

> 指定した文字列(例えば「aA09アイウ」)を1文字毎に処理を行い

この文字列は、どのように取り込んだものでしょうか?
その段階で、JIS8ではなくなっているとかは、考えられませんか?
例えば、 ファイルからStringへ読み込んだ段階で、内部用のコードに変換がかかってるとか。


外部のJIS8
→Java内部にStringとして取り込み(Unicodeに変換)
→ Stringで半角カナから全角カナ変換
(例 http://www7a.biglobe.ne.jp/~java-master/samples/ …)

とするのがいいように思います。
    • good
    • 0

static final int[] JISTABLE = {0x61,0x41,0x31,0x39,0xb1,0xb2,0xb3,0xdd};


satic final int[] UNICODETABLE = {0x0061,0x0041,0x0031,0x0039,0x30a2,0x30a4,0x30a6,0x30f3};
ではダメですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ちょっと自分の勘違いで、自己解決致しました。
今後も何かありましたらよろしくお願いします。

お礼日時:2017/07/10 23:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qfor文の部分を日本語で教えてください

for文の部分を日本語で教えてください

Aベストアンサー

> これだと2が素数として表示されなくないですか?

数 i が素数なのか判定する数 j は、1 より大きく自分自身より小さい数の全てです
→ i = 2 の場合、数 j は 1 より大きく 2 より小さい数の全て
→ つまり自然数の j は存在しません

数 i の約数に、数 j が含まれていたら、それは素数ではありません
→ i = 2 の場合、自然数 j が存在しないので、含まれているわけがない
→ ゆえに 2 は素数です

Q最も高い身長を表示するプログラム

5人分の身長から最も高い身長を表示するプログラムをつくったのですが、エラーがでて実行できません。改善すべきところを教えてください。お願いします。
int main(void)
{
double a[5], max = 0;
int i;

for (i = 1; i <= 5; i++)
{
a[i] = 0;
}
printf("数値を5つ入力してください。\n");

for (i = 1; i <= 5; i++)
{
scanf("%lf", &a[i]);
}

for (i = 1; i <= 5; i++)
{
if (a[i] > max)
max = a[i];
}

printf("最も高い身長は%fです\n", max);

return 0;
}

Aベストアンサー

double a[5] ;
と宣言したら、安全に使えるのは a[0] 〜 a[4] です。

なので、このプログラムを安全なものにするなら
・double a[5]はそのまま、 i=0;i<5;i++ にして、 i=0〜4 の範囲で使う
・「i = 1; i <= 5; i++は変えない」 のなら
 ・ i=1〜5を、 0〜4 に対応させて使う
   単純明快なのは、 a[i-1] とすること
 ・double a[5+1] と宣言して、a[5] を安全に使えるようにする。
   a[0] が無駄になるけど気にしない

Q変数にドットをいれることはかのうでしょうか?

変数にドットをいれることはかのうでしょうか?
var text = '.......';
alert(text);

Aベストアンサー

#1さんの提示されたとおり「変数名」にドットは入れられませんが
命題の変数内にドットを入れる=ドットを含む文字列は
提示されているソースがそのまま動きますよね?

<script>
var text = '.......';
alert(text);
</script>

QプログラミングC言語

急募



行列の計算(xとyとx*y)を表示するプログラムを作成したのですが、デバックなしで実行はできたがプログラムが、表示されません。
どなたか、プログラムの間違えているところ、間違えているところの正しい答えを教えていただけないでしょうか


#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j=2; j++){
for(k=0; k<2; k++)

z[i][j]+=x[i][k]*y[k][j];
}
}

printf("行列X=\n");

for(i=0; i<2; i++){
for(j=0; j<3; j++)
printf("%3d",x[i][j]);
putchar('\n');

}

printf("行列Y=\n");

for(i=0; i<3; i++){
for(j=0; j<2; j++)
printf("%3d",y[i][j]);
putchar('\n');
}


printf("\nx*y=\n");

for(i=0; i<2; i++){
for(j=0; j<2; j++)
printf("%3d",z[i][j]);
putchar('\n');
}



return 0;
}

急募



行列の計算(xとyとx*y)を表示するプログラムを作成したのですが、デバックなしで実行はできたがプログラムが、表示されません。
どなたか、プログラムの間違えているところ、間違えているところの正しい答えを教えていただけないでしょうか


#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j=2; j++){
for(k=0; k<2; k++)

z[i][j]+=x[i][k]...続きを読む

Aベストアンサー

とりあえず、1っ箇所修正しました。
//修正・・・とコメントを入れておきます。

#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j<2; j++){ //修正
for(k=0; k<2; k++)

z[i][j]+=x[i][k]*y[k][j];
}
}

printf("行列X=\n");

for(i=0; i<2; i++){
for(j=0; j<3; j++)
printf("%3d",x[i][j]);
putchar('\n');

}

printf("行列Y=\n");

for(i=0; i<3; i++){
for(j=0; j<2; j++)
printf("%3d",y[i][j]);
putchar('\n');
}


printf("\nx*y=\n");

for(i=0; i<2; i++){
for(j=0; j<2; j++)
printf("%3d",z[i][j]);
putchar('\n');
}



return 0;
}

とりあえず、1っ箇所修正しました。
//修正・・・とコメントを入れておきます。

#include<stdio.h>

int main(void)

{
int i,j,k;

int x[2][3]={{3,0,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int z[2][2]={0};

for(i=0; i<3; i++){
for(j=0; j<2; j++){ //修正
for(k=0; k<2; k++)

z[i][j]+=x[i][k]*y[k][j];
}
}

printf("行列X=\n");

for(i=0; i<2; i++){
for(j=0; j<3; j++)
printf("%3d",x[i][j]);
putchar('\n');

}

printf("行列Y=\n");

for(i=0; i<3; i++){
for(j=0; j<2; j+...続きを読む

QC++を学ぶためにCの知識は必須ですか?

将来の就職と個人的興味のため、C++を勉強しようと思ったんですが(C++にはオブヘクト志向があるため)ネットでいろいろ調べていると「Cが基盤になっているためCから勉強を始めたほうがいい」とありました。
正確にはどこまでの知識と経験が必要ですか?
そもそもC++を学ぶためにCの知識は必須ですか?

Aベストアンサー

まあ、Cの言語仕様を一通り軽くやっといた方が良いかも。
ポインター、配列、構造体、整数演算、型の表記の仕方とかは
結構癖があるから、事前に知っといた方が良いでしょう。

Cの言語仕様ってC++に比べて驚くほど小さいので
そんなに時間はかからないと思う。
最初からクラスも大変だし、最初はベターCから
始めるのも良いのでは。

しかし就職にC++が役立つかというと、確かに
c++使いまくりのシステムもあるが
Javaの方が圧倒的に有利というのは
覚えておいた方が良いでしょう。

Qどうすれば本格的なGUIプログラミングができるか

もう学生時代から20年以上も独学でOSの変遷(MS-DOS→ウインドウズ95→98SE→XP→Vista→8.1→10)にともなってコマンドラインのC言語の開発環境を作ってきて勉強を続けてきましたが、一向に満足なプログラムができるようになりません。
(わずかに、値を入力して場合分けして1000回以上の繰り返し計算をして結果を画面出力する、というプログラム程度です。)

仕事はITとは無縁で、材料系の製造業です。化学合成とか分析には詳しいですが、周りにもプログラミングのプの字も知っている人はいません。IT系の会社なんかに勤めていたら、そういうことを知っている人がごろごろいそうな気がしますが、いませんので自分でいろいろな情報源から調べるのみですが、あまり金を掛けませんので情報量にも限りがあります。

今つくりたいのは、ウインドウズのソフトの印刷結果を、ビットマップとかJPEGほか、任意の形式の画像に変換して保存するプログラムです。よく、ベクターとかにアップロードされているようなプログラムを、自分でも作れるようになるのが目標です。

何年かかっても構いません。どういう本を買い、どういう勉強をすればできるようになるのでしょうか。

ちなみに、今のPCのOSはWindows10で、マイクロソフトのVisual Studioをインストールしていて、コマンドラインのC言語のプログラムなら、無料のテキストエディタ(今使っているのはTeraPad)でソースを書いて、コンパイル・リンクして走らせる、ということばかりずっとやっていますが、本格的なウインドウズ上のプログラムを作りたいです。C#なら手っ取り早く作れる、と何かで知って、最近C#の、開発環境の作り方も書いた本を買いましたが、C#で本格的なプログラムができるか、疑問に思っています。いまさらRubyとかPythonを始めるのもどうなんだろうか、と思っています。C++ならできるのでしょうか。C++の入門書も持っています。

どなたかアドバイスをお願い致します。

もう学生時代から20年以上も独学でOSの変遷(MS-DOS→ウインドウズ95→98SE→XP→Vista→8.1→10)にともなってコマンドラインのC言語の開発環境を作ってきて勉強を続けてきましたが、一向に満足なプログラムができるようになりません。
(わずかに、値を入力して場合分けして1000回以上の繰り返し計算をして結果を画面出力する、というプログラム程度です。)

仕事はITとは無縁で、材料系の製造業です。化学合成とか分析には詳しいですが、周りにもプログラミングのプの字も知っている人はいません。IT系の会社なんかに...続きを読む

Aベストアンサー

Windowsのプログラムを作るなら今はC#が最適ですね。
C#言語とフレームワークの.NETはMicrosoftが10年来普及に努めており、今やWindowsの大半の機能を.NET上のみで操れます。
.NET上で動くプログラムを作る言語としてはC#の他にVisualBasicやC++/CLIなどがありますが、情報量の多さと書式がCに似ている点でお勧めはC#です。
名前の通り書式がC言語を元にしているので、Cが分かればC#も、ポインタが(まともな方法では)使えないくらいでだいたい同じことができます。

Qプログラミング初心者です!このエラーの意味があまりよくわからないのですがどういう意味なのでしょうか?

このプログラムのエラーの用語?みたいなやつの意味がよくわからないので教えてください!

Aベストアンサー

すみません、画像が不鮮明で、詳細まではわかりません。

class Class1 {}
でよろしいでしょうか?
文法通りに解釈すれば、これでClass1の定義は終了です。
ここで区切られなければならないならない筈が、なんか続きっぽく書いてある、ということでエラーになっています。

その後に続く { 以降は、Class1の外です。
本当は、この後の部分が Class1の内容ではないでしょうか?
だとすると、Class1直後の{} が不要です。


エラーメッセージは、コンピュータの解釈した内容で表示されます。
本当の原因が、エラーメッセージの通りであるとは限りません。
表示された行より前を確認しましょう


また、エラーメッセージが沢山出てもあわてないことです。
一つ間違いがあると、本来正しい箇所まで間違っていると判断されてしまうことがよくあります。
そんなときは、その一つを治すだけで一気にエラーが無くなります。

Qファイルをテキストエディタで開いた中にあるデータを一括で取得したい

テキストエディタで開くと下記のような文字列が表示されるファイルが数万件があります。
(.txtや.csvファイルではありません)
↓ここから
 i default ・ u ネ B $g 0 ] $g C F G 81 1 ヘ A1 145123548748 ヒ u ネ H h& h& C F  & ! T 0 U @・ ・ ク ・  g 」
↑ここまで
(実際はもっと長いです)

それぞれファイルごとに上記の中にある『145123548748』等の12桁の数字が必ず1つだけ含まれています。
この12桁の数字だけを取得し、.txtファイルとして一括で取得することは可能でしょうか?
バッチファイル等で作れればと思っていますが何か良い方法がありましたら教えてください。

最終的には、
『12桁の数字』(半角スペース)『ファイルの場所とファイル名』の一覧を作れればと思っています。
例)kansei.txt
145123548748 C:\aaa\bbb\ccc\xxx.zzz
468197989411 C:\aaa\bbb\ddd\yxy.zzz
684315451373 C:\eee\fff\xxy.zzz

テキストエディタで開くと下記のような文字列が表示されるファイルが数万件があります。
(.txtや.csvファイルではありません)
↓ここから
 i default ・ u ネ B $g 0 ] $g C F G 81 1 ヘ A1 145123548748 ヒ u ネ H h& h& C F  & ! T 0 U @・ ・ ク ...続きを読む

Aベストアンサー

grepツールもしくはテキストエディタ自体のgrep機能をつかえばよろしいのでは?

QGrepの出力結果を細かく指定したい

https://oshiete.goo.ne.jp/qa/9818180.html
上記質問の続きです。

サクラエディタのGrep機能で一括で12桁の数字を抜き出すことはできたのですが、
上記質問の『例)kansei.txt』の形式で出力ができませんでした。
Grepツールで出力結果を細かく指定して出力できるものはありますか?
Grepの結果に毎回自分で置換を行えば目的のものは得られますが、同様の作業を何度も行う予定なので楽にできる方法があればと思っています。

自分でも調べましたが出力結果について明確に説明されているものは少なく、
Grepと同じようなコマンドプロンプトのfindstrや、PowershellのSelect-Stringも調べましたが
できるのかわからなかったので質問しました。

PCはWindows7です。

Aベストアンサー

N0.3のお礼を拝見しました。
12桁の途中で改行が入るということですよね?
では、以下でどうでしょう

-----ここから
$me = "search.ps1" # 本スクリプトファイル名
$out = "kansei.txt" # 出力ファイル名

Get-ChildItem | %{
$name = $_.Name
if(($name -ne $me) -and ($name -ne $out)){
$s = Get-Content $_
if($s.gettype().Name -eq "Object[]"){$s = $s -join ""}
if($s -match "\d{12}"){
"$($Matches[0]) $($_.FullName)" | Out-File -FilePath $out -Append
}
}
}
----ここまで

Qjava入門

System.out.print()のかっこの中身が表示されません
コードはこんな感じです
public class ○○
{
public static void main( String[] args )
{
System.out.print("こんにちは");
}
}

コマンドプロンプトでコンパイルしてるんですがjavac ファイル名.javaと入力しても何も表示されません(エラーも出ません)
なぜでしょうか?

Aベストアンサー

"javac ファイル名.java" はコンパイルを行うだけで実行されません(ファイル名.classが作成されます)

実行は "java ファイル名" です。(.classは不要)


人気Q&Aランキング