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.
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.
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) |
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.
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.
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;
}
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".
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
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.
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
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.
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
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
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.
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.
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
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)
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.
Der Yuan wurde bereits überarbeitet, aber wir hoffen, dass dieser Artikel Ihnen in Zukunft bei der Reaktion helfen wird.
Recommended Posts