[JAVA] [Endgültige Version] Überprüfen Sie den Betrieb des japanischen Kalenders auf der Intensivstation, um das neue Yuan-Problem zu unterstützen.

Inhalt aktualisieren

Einführung

In diesem Artikel richtet sich die neue Originalausgabe "Rewa (Rewa)" an Anwendungen, die ICU (International Components for Unicode) enthalten, eine plattformübergreifende Internationalisierungsbibliothek. Ich werde die Aktionen erklären, die erforderlich sind, um auf "Iwa)" zu antworten.

Der Inhalt dieses Artikels basiert auf dem, was unter hier geschrieben wurde.

ICU-Status

Ab Version 64.2, die am 18. April 2019 (japanische Zeit) veröffentlicht wurde, hat die Intensivstation Ressourcen zur Unterstützung der neuen Yuan-Ausgabe "Reiwa" integriert. Zuvor waren ab Version 63 (63.1 *), die am 15. Oktober 2018 veröffentlicht wurde, bereits Ressourcen zur Unterstützung des neuen Yuan in Form von "temporärem Yuan", aber vorläufigem Yuan enthalten Das Problem muss nicht mehr angegeben werden **. Ab Version 64 (64.1), die am 27. März 2019 veröffentlicht wurde, kann "erstes Jahr" zusätzlich zu einem Jahr als Notation für Eingabe und Ausgabe behandelt werden. Derzeit unterstützt die Intensivstation die neue Yuan-Frage in den folgenden beiden Punkten.

Hinweis * Die erste Version ist 63.1, kein Nullstart wie 63.0.

  1. "Reiwa" wurde als Originalausgabe vom 1. Mai 2019 hinzugefügt (ab 64.2)
  2. Es können sowohl "1 Jahr" - als auch "Erstjahr" -Notationen verarbeitet werden (ab 64.1).
  3. ~~ Ein Platzhalter wurde hinzugefügt, um die vorläufige Yuan-Zahl "QQ" (zwei "Cue" in voller Breite) als Yuan-Ausgabe vom 1. Mai 2019 ~~ (von 63,1 bis 64,1) anzugeben.
  4. ~~ Um Platzhalter zu verwenden, geben Sie "ICU_ENABLE_TENTATIVE_ERA = true" im JVM-Argument oder in der Umgebungsvariablen ~~ an (von 63.1 bis 64.1).

Anwendungen, die mit Versionen der Intensivstation älter als Version 63.1 verknüpft sind, können getestet werden, indem die Bibliothek einfach durch Version 64.2 ersetzt wird. Um "Reiwa" anzuzeigen oder durch Eingabe zu akzeptieren, ist dies jedoch nur möglich, wenn die Anwendung bereits japanische Kalenderformate wie "Heisei" und "Showa" durch Eingabe und Ausgabe unterstützt. Daher ** Wenn Sie sich zu diesem Zeitpunkt nur mit Daten im westlichen Kalender befassen, wird das Ersetzen der Bibliothek die neue Yuan-Ausgabe nicht sofort unterstützen **

Die Operation ist wie folgt zusammengefasst.

Eingabe im japanischen Kalender 63.1 oder weniger oder Intensivstation_ENABLE_TENTATIVE_ERA=false 63.1 oder mehr und Intensivstation_ENABLE_TENTATIVE_ERA=true 64.2 oder mehr (keine Umgebungsvariablen erforderlich)
1. Mai 2019 1. Mai 2019 QQ 1. Mai, 1 ..(63.1) /QQ 1. Mai, 1. Jahr(64.1) 1. Mai, 1. Jahr von Reiwa
QQ 1. Mai, 1 .. Perspektivfehler QQ 1. Mai, 1 ..(63.1) /QQ 1. Mai, 1. Jahr(64.1) Perspektivfehler
QQ 1. Mai, 1. Jahr Perspektivfehler Perspektivfehler(63.1) /QQ 1. Mai, 1. Jahr(64.1) Perspektivfehler
1. Mai, 1. Jahr von Reiwa Perspektivfehler Perspektivfehler(63.1) /Perspektivfehler(64.1) 1. Mai, 1. Jahr von Reiwa

Dieses Ergebnis setzt "java.util.Calendar.setLenient (true)" und "com.ibm.icu.util.Calendar.setCalendarLenient (true)" voraus (beide sind Standardwerte und müssen nicht angegeben werden). .. "1. Mai 2019" ist ein Datum, das tatsächlich nicht existiert, aber es hängt von den Anwendungsspezifikationen ab, ob dies streng genommen ein Analysefehler ist oder nicht. Das Verhalten von "setLenient ()" und "setCalendarLenient ()" wird in diesem Artikel nicht behandelt, da es eine Vielzahl von Inhalten enthält.

Als weiteres Thema in Bezug auf die Korrespondenz mit der neuen Yuan-Ausgabe "Reiwa" gibt es außerdem die Behandlung gemeinsamer Zeichen, die die Yuan-Ausgabe mit einem Zeichen darstellen, wie "㍼" und "㍻". Dies wird jedoch auch in diesem Artikel nicht behandelt. Hmm.

Die Notation "Erstes Jahr" wird von ICU v64.1 unterstützt. Bitte beachten Sie jedoch, dass die Version 64.1 noch nicht mit "Reiwa" kompatibel ist, da dies vor der Ankündigung der neuen Originalausgabe "Reiwa" war. Bitte verlinken Sie mit v64.2 oder höher.

Die Zeitleiste kann wie folgt zusammengefasst werden.

Jahreszeit ICU Version Unterstützt neuen Yuan
Oktober 2018 63.1 "QQ" ICU_ENABLE_TENTATIVE_ERA=Aktiviert mit true
März 2019 64.1 "QQ" ICU_ENABLE_TENTATIVE_ERA=Aktiviert mit true,"1 Jahr=Korrespondenz "Erstes Jahr"
April 2019 64.2 "Reiwa" hinzugefügt(ICU_ENABLE_TENTATIVE_EPOCHENicht notwendig)

Korrespondenz mit früheren ICU-Versionen

Gemäß dieser Pull Request (ICU-20536) gibt es zusätzlich zu Version 64.2 Bestellungen für frühere Versionen. Es scheint, dass die ursprüngliche Ausgabe von Japanisch hinzugefügt wurde. Ich konnte die folgenden Versionsnummern bestätigen.

4.8.2 50.2 51.3 52.2 53.2 54.2 55.2 56.2 57.2 58.3 59.2 60.3 61.2 62.2 63.2

Im Vergleich zu Version 64.2 fehlt in diesen Versionen die folgende neue Yuan-Unterstützung.

Was Sie jetzt tun können

Jetzt werde ich erklären, wie die ICU-Version 64.2 (und frühere ICU-Versionen, die ein Dekret unterstützen) mit der Anwendung verknüpft und die Funktion überprüft wird.

Beispiel für C ++ - Quellcode mit ICU4C

ICU (ICU4C) bietet APIs für C und C ++, aber hier werden wir ein C ++ - Beispiel verwenden.

sample.cpp


#include <stdio.h>
#include <iostream>
#include "unicode/datefmt.h"
#include "unicode/dtfmtsym.h"
#include "unicode/gregocal.h"
#include "unicode/timezone.h"
#include "unicode/unistr.h"
#include "unicode/ustring.h"
#include "unicode/dtptngen.h"
#include "unicode/dtitvfmt.h"

using namespace icu;

//Ein einfaches Dienstprogramm, um verstümmelte Zeichen unter Windows zu verhindern
void myprintf(std::string format, UnicodeString ustr) {
	char abuf[0x100];
	ustr.extract(0, sizeof(abuf), abuf);
	printf(format.c_str(), abuf);
}

int main( int argc, char **argv )
{
	UErrorCode status = U_ZERO_ERROR;
	//AD-basiertes Gebietsschema
	Locale loc_jp1 = Locale::getJapanese();
	//Designiert vom japanischen kalenderbasierten Gebietsschema LanguageTag
	Locale loc_jp2 = Locale("ja-u-ca-japanese");

	// (A)Mustergenerierungsklasse
	DateTimePatternGenerator *g_jp1 = DateTimePatternGenerator::createInstance(loc_jp1, status);
	status = U_ZERO_ERROR;
	DateTimePatternGenerator *g_jp2 = DateTimePatternGenerator::createInstance(loc_jp2, status);
	if (U_FAILURE(status)) {
		return 1;
	}

	// (B)Holen Sie sich das entsprechende Datumsformatmuster für jedes Gebietsschema
	status = U_ZERO_ERROR;
	UnicodeString up_jp1 = g_jp1->getBestPattern(UnicodeString("yyyyMMMd"), status);
	myprintf("pattern jp1: %s\n", up_jp1);
	status = U_ZERO_ERROR;
	UnicodeString up_jp2 = g_jp2->getBestPattern(UnicodeString("yyyyMMMd"), status);
	myprintf("pattern jp2: %s\n", up_jp2);

	// (C)Generieren Sie mit einem Formatmuster
	status = U_ZERO_ERROR;
	SimpleDateFormat *df_jp1 = new SimpleDateFormat(up_jp1, loc_jp1, status);
	status = U_ZERO_ERROR;
	SimpleDateFormat *df_jp2 = new SimpleDateFormat(up_jp2, loc_jp2, status);

	// (A),(B),(C)Klicken Sie hier, um zu erfahren, wie Sie DateFormat schreiben
	//DateFormat *df_jp1 = DateFormat::createInstanceForSkeleton("yMMMd", loc_jp1, status);
	//DateFormat *df_jp2 = DateFormat::createInstanceForSkeleton("yMMMd", loc_jp2, status);

	UnicodeString uin = UnicodeString(argv[1]);
	myprintf("input:%s\n", uin);
	status = U_ZERO_ERROR;
	//Zunächst Perth als Kalender
	UDate inDate = df_jp1->parse(uin, status);
	if (U_FAILURE(status)) {
		std::cout << "Parse error (" << u_errorName(status) << ") try another." << std::endl;
        status = U_ZERO_ERROR;
	//Als nächstes Perth als japanischer Kalender
        inDate = df_jp2->parse(uin, status);
    	if (U_FAILURE(status)) {
		    std::cout << "Parse error (" << u_errorName(status) << ") again." << std::endl;
            return 1;
        }
	}
	//Geben Sie das eingegebene Datum in jedem westlichen und japanischen Kalender aus
	UnicodeString ud_jp1;
	df_jp1->format(inDate, ud_jp1);
	myprintf("output jp1:%s\n", ud_jp1);
	UnicodeString ud_jp2;
	df_jp2->format(inDate, ud_jp2);
	myprintf("output jp2:%s\n", ud_jp2);

	return 0;
}

Ausführung unter macOS

In macOS ist eine ICU integriert. Um die OS-ICU zu testen, ohne sie direkt zu aktualisieren, nutzen Sie Homebrew (http://brew.sh/), um ICU 64.2 zu installieren. (Veröffentlicht am 19. April 2019)

$ brew install icu4c

Der obige Beispielcode kann wie folgt kompiliert werden. Der Umgebungsvariablenteil kann auch als Argument für den Compiler angegeben werden. Wenn sich das Installationsziel von Brew vom Beispiel unterscheidet, ersetzen Sie es entsprechend.

$ export C_INCLUDE_PATH=/usr/local/opt/icu4c/include
$ export CPLUS_INCLUDE_PATH=/usr/local/opt/icu4c/include
$ export LIBRARY_PATH=/usr/local/opt/icu4c/lib
$ export LD_LIBRARY_PATH=/usr/local/opt/icu4c/lib
$ clang++ -licuio -licui18n -licutu -licuuc -licudata -std=c++1z sample.cpp

Sie können dies wie folgt tun: Geben Sie im ersten Argument das Eingabedatum im westlichen oder japanischen Kalender an.

Das Ausführungsbeispiel basiert auf v64.2. Ersetzen Sie für Ergebnisse, die unter Version 63.2 ausgeführt werden, "erstes Jahr" durch "1 Jahr".

(A) Eingabe als Heisei und Ausgabe im westlichen Kalender und Dekret

Abhängig von der Einstellung von "setLenient ()" kann es auch dann verarbeitet werden, wenn das Datum des Abstimmungszeitraums in Heisei eingegeben wird.

Da df_jp1 Eingaben im westlichen Kalender erwartet, wird Parse error einmal angezeigt.

$ ./a.aus 1. Mai 2019
pattern jp1:JJJJ Jahr M Monat d Tag
pattern jp2:Gy Jahr M Monat d Tag
input:1. Mai 2019
Parse error (U_ILLEGAL_ARGUMENT_ERROR) try another.
output jp1:1. Mai 2019
output jp2:1. Mai, 1. Jahr von Reiwa
(B) Eingabe als Heisei und Ausgabe im westlichen Kalender und Heisei

Aufgrund der Unterstützung des Dekrets ist es nicht mehr möglich, Daten nach dem "1. Mai, 1. Dekretjahr" in Heisei mit dem oben genannten Beispielcode zwangsweise auszugeben.

(C) Eingabe im westlichen Kalender und Ausgabe im westlichen Kalender und die Summe

Ich erhalte keinen "Analysefehler".

$ ./a.aus 1. Mai 2019
pattern jp1:JJJJ Jahr M Monat d Tag
pattern jp2:Gy Jahr M Monat d Tag
input:1. Mai 2019
output jp1:1. Mai 2019
output jp2:1. Mai, 1. Jahr von Reiwa
(D) Eingabe im westlichen Kalender und Ausgabe im westlichen Kalender und in Heisei

Aufgrund der Unterstützung des Dekrets ist es nicht mehr möglich, Daten nach dem "1. Mai, 1. Dekretjahr" in Heisei mit dem oben genannten Beispielcode zwangsweise auszugeben.

(E) Eingabe in Dekret und Ausgabe in chronologischem Kalender und Dekret

Da df_jp1 Eingaben im westlichen Kalender erwartet, wird Parse error einmal angezeigt.

$ ./a.aus 1. Mai, 1. Jahr von Reiwa
pattern jp1:JJJJ Jahr M Monat d Tag
pattern jp2:Gy Jahr M Monat d Tag
input:1. Mai, 1. Jahr von Reiwa
Parse error (U_ILLEGAL_ARGUMENT_ERROR) try another.
output jp1:1. Mai 2019
output jp2:1. Mai, 1. Jahr von Reiwa

Selbst wenn Sie "1 Jahr" eingeben, wird es im "ersten Jahr" ausgegeben.

$ ./a.aus 1. Mai, 1. Jahr
pattern jp1:JJJJ Jahr M Monat d Tag
pattern jp2:Gy Jahr M Monat d Tag
input:1. Mai, 1. Jahr von Reiwa
Parse error (U_ILLEGAL_ARGUMENT_ERROR) try another.
output jp1:1. Mai 2019
output jp2:1. Mai, 1. Jahr von Reiwa
(F) Eingabe im Dekret und Ausgabe im westlichen Kalender und in Heisei

Abhängig von der Einstellung von setLenient () kann es auch verarbeitet werden, indem das Datum der Heisei-Periode in die Summe eingegeben wird. In diesem Fall wird es in Heisei ausgegeben.

$ ./a.aus 1. April, 1. Jahr von Reiwa
pattern jp1:JJJJ Jahr M Monat d Tag
pattern jp2:Gy Jahr M Monat d Tag
input:1. April, 1. Jahr von Reiwa
Parse error (U_ILLEGAL_ARGUMENT_ERROR) try another.
output jp1:1. Mai 2019
output jp2:1. April 2019
$ ./a.aus 1. April, 1. Jahr
pattern jp1:JJJJ Jahr M Monat d Tag
pattern jp2:Gy Jahr M Monat d Tag
input:1. April, 1. Jahr von Reiwa
Parse error (U_ILLEGAL_ARGUMENT_ERROR) try another.
output jp1:1. Mai 2019
output jp2:1. April 2019

Läuft unter Linux

Bestätigt unter Ubuntu 18.04 (64bit).

Laden Sie "icu4c-64_2-Ubuntu-18.04-x64.tgz" von der ICU-Site herunter und entpacken Sie es. Das extrahierte Verzeichnis wird hier als "$ ICUPATH" bezeichnet.

Der Rest kann auf die gleiche Weise wie für macOS erledigt werden.

$ export C_INCLUDE_PATH=$ICUPATH/include
$ export CPLUS_INCLUDE_PATH=$ICUPATH/include
$ export LIBRARY_PATH=$ICUPATH/lib
$ export LD_LIBRARY_PATH=$ICUPATH/lib
$ clang++ -licuio -licui18n -licutu -licuuc -licudata -std=c++1z sample.cpp

Oder

$ g++ sample.cpp -licuio -licui18n -licutu -licuuc -licudata

Die Ausführungsmethode ist dieselbe wie für macOS.

Ausführung unter Windows (VC ++)

Erstellen Sie ein Projekt in Visual Studio mit "Visual C ++"> "Windows Desktop"> "Windows Console Application". Hier lautet der Lösungsname "JapaneseNewEraICU".

Laden Sie "icu4c-64_2-Win64-MSVC2017.zip" von der ICU-Site herunter und entpacken Sie es. Der extrahierte Ordner wird hier als "% ICUPATH%" bezeichnet.

Stellen Sie die folgenden Werte in den Lösungseigenschaften ein.

Artikel Zu setzender Wert
Konfigurationseigenschaften> VC++Verzeichnis
Verzeichnis einschließen %ICUPATH%\include;$(IncludePath)
Bibliotheksverzeichnis %ICUPATH%\lib64;$(LibraryPath)
Konfigurationseigenschaften>Linker>Eingang
Zusätzliche abhängige Dateien icuio.lib;icuin.lib;icutu.lib;icuuc.lib;%(AdditionalDependencies)

Wenn ich mit dieser Einstellung kompiliere, wird die Fehlermeldung "Das Programm kann nicht gestartet werden, da icuin64.dll auf Ihrem Computer fehlt. Um dieses Problem zu beheben, versuchen Sie, das Programm neu zu installieren." Dies ist ein Fehler, da die heruntergeladene ICU-DLL nicht in der Umgebungsvariablen% PATH% gefunden wurde.

Öffnen Sie bei der Ausführung eine separate Eingabeaufforderung und

C:\> set PATH=%ICUPATH%\bin64;%PATH%

Nach dem Rennen

C:\> .\JapaneseNewEraICU.exe 16. Februar 2020

Und so weiter.

Java-Quellcodebeispiel mit ICU4J

Fügen Sie der Maven-Repository-Abhängigkeit "ICU4J" hinzu.

pom.xml


<!-- https://mvnrepository.com/artifact/com.ibm.icu/icu4j -->
<dependency>
    <groupId>com.ibm.icu</groupId>
    <artifactId>icu4j</artifactId>
    <version>64.2</version>
</dependency>

Hier ist ein Codebeispiel ähnlich C ++.

test/Sample.java


package test;

import java.text.ParseException;
import java.util.Date;
import java.util.Locale;

import com.ibm.icu.text.DateTimePatternGenerator;
import com.ibm.icu.text.SimpleDateFormat;

public class Sample {

    public static void main(String[] args) {
        Locale loc_jp1 = Locale.JAPANESE;
        Locale loc_jp2 = Locale.forLanguageTag("ja-u-ca-japanese");

        //(A)
        DateTimePatternGenerator g_jp1 = DateTimePatternGenerator.getInstance(loc_jp1);        
        DateTimePatternGenerator g_jp2 = DateTimePatternGenerator.getInstance(loc_jp2);
        //(B)
        String p_jp1 = g_jp1.getBestPattern("yyyyMMMd");
        System.out.format("pattern jp1: %s\n",p_jp1);
        String p_jp2 = g_jp2.getBestPattern("yyyyMMMd");
        System.out.format("pattern jp2: %s\n",p_jp2);
        //(C)
        SimpleDateFormat df_jp1 = new SimpleDateFormat(p_jp1, loc_jp1);
        SimpleDateFormat df_jp2 = new SimpleDateFormat(p_jp2, loc_jp2);

        //(A),(B),(C)Klicken Sie hier, um zu erfahren, wie Sie DateFormat schreiben
        //import com.ibm.icu.text.DateFormat;In Verbindung mit
        //DateFormat df_jp1 = DateFormat.getInstanceForSkeleton("yMMMd", loc_jp1);
        //DateFormat df_jp2 = DateFormat.getInstanceForSkeleton("yMMMd", loc_jp2);

        String input = args[0];
        System.out.format("input: %s\n", input);
        Date idate = null;
        try {
            idate = df_jp1.parse(input);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        if (idate==null) {
            try {
                idate = df_jp2.parse(input);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        
        String out_jp1 = df_jp1.format(idate);
        System.out.format("output jp1: %s\n", out_jp1);
        String out_jp2 = df_jp2.format(idate);
        System.out.format("output jp2: %s\n", out_jp2);
    }
}

Zusätzlich zur Ausführung auf der IDE sieht es wie folgt aus, wenn es direkt über den Befehl ausgeführt wird.

$ java -cp ~/.m2/repository/com/ibm/icu/icu4j/64.2/icu4j-64.2.jar:target/classes test.Probe Reiwa 10. Mai, 1. Jahr

(Bonus) Unterstützung mit Node.js.

Ab Node.js v12.1, das am 29. April 2019 veröffentlicht wurde, wird es mit ICU v64.2 verknüpft. Daher ist es jetzt möglich, Reiwa als Originalausgabe ohne besondere Bezeichnung zu verwenden.

Da es keine Bibliothek wie ICU for NodeJS gibt, ist das folgende Beispiel ein Beispiel für die Anzeige des Datums des Zeitraums der Abstimmung mit einem normalen Date-Objekt.

test/sample.js


var date = new Date(Date.UTC(2019, 11, 20, 3, 0, 0));
var options = {
era: 'short',
year: 'numeric',
month: 'narrow',
day: 'numeric',
weekday: 'narrow'
};
console.log(date.toLocaleString('ja-u-ca-japanese',options));
$ node test/sample.js
20. Dezember, 1. Jahr von Reiwa(Tag)

Was Sie tun können, wenn der neue Yuan entschieden ist

Wie oben unter "ICU-Status" erläutert, wurde ICU Release v64.2 mit eingebettetem "Rewa" veröffentlicht.

Wenn Sie die Anzeige und Eingabe der vorläufigen Yuan-Ausgabe in "QQ" mit ICU 63.1 / 64.1 oder höher gründlich getestet haben, können Sie sie nach der offiziellen Veröffentlichung durch ICU v64.2 ersetzen, um zur neuen Yuan-Ausgabe zu gelangen. Die Korrespondenz ist abgeschlossen.

Ein zu beachtender Punkt ist die Gebietsschemaeinstellung, die dem japanischen Kalender entspricht. Das Gebietsschema "ja-u-ca-japanese", das im Beispielquellcode als "jp2" verwendet wird, ist das Gebietsschema, das dem japanischen Kalender entspricht. Es funktioniert auch in Formaten wie "ja_JP_TRADITIONAL" oder "ja_JP_JP". Da diese Werte vom Benutzer oder System selten mit der Umgebungsvariablen "LANG" usw. festgelegt werden, wird erwartet, dass die Anwendung ihre eigene Beurteilungslogik erstellt, um zu bestimmen, ob sie im japanischen Kalender ausgeführt wird.

schließlich

Der Yuan wurde bereits überarbeitet, aber wir hoffen, dass dieser Artikel Ihnen in Zukunft bei der Reaktion helfen wird.

Recommended Posts

[Endgültige Version] Überprüfen Sie den Betrieb des japanischen Kalenders auf der Intensivstation, um das neue Yuan-Problem zu unterstützen.
Zusammenfassung der Revisionen (neue Yuan-Probleme) nach Java-Version
Überprüfen Sie die Version von Cent OS
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Zeigen Sie den japanischen Kalender und Tag mit der Java8-Standardklasse an
Überprüfen Sie den Betrieb mit dem Steg mit Maven.
Überprüfen Sie die Version der Standard-Web-Software.
Überprüfen Sie die Funktion der Schnittstelle über den Thread
Achten Sie bei Verwendung des Float-Typs auf die Grenzprüfung des Eingabewerts
Der Name ist und das Alter ist Senden Sie eine Benachrichtigung an Slack mit der Java-freien Version von Sentry (mit Lambda)
Überprüfen Sie die installierte und aktivierte JDK-Version
Ich habe versucht, den Betrieb der http-Anfrage (Put) mit dem Talented API Tester zu überprüfen
[Rails] So zeigen Sie die Wettervorhersage der registrierten Adresse auf Japanisch mit OpenWeatherMap an
[Java] Überprüfen Sie die JDK-Version der erstellten Kriegsdatei
So laden Sie eine ältere Version von Apache Tomcat herunter