Jakeuj's Notes master Help

中文亂碼問題

紀錄一下本地正常但發布後 API 回傳亂碼的問題。

問題描述

如果使用 Visual Studio ASP.NET Core 專案,並且在專案中使用了中文,那麼在發布專案後,API 回傳的中文可能會出現亂碼。

解決方法

  1. 建議 使用 Rider 開發專案,Rider 預設會將檔案編碼設定為 UTF-8。

  2. 使用 Visual Studio 開發專案,在專案中新增一個 .editorconfig 檔案,並在檔案中加入以下設定:

# Code files [*.{cs,csx,vb,vbx}] charset = utf-8-bom

這樣設定之後,Visual Studio 開啟的檔案就會預設使用 UTF-8 編碼,這樣就可以避免中文亂碼的問題。

.editorconfig 文件

.editorconfig 是一個用來統一不同 IDE 或編輯器之間的編碼風格設定的文件,這對於團隊協作開發非常有用。

以下是一個範例 .editorconfig 文件,你可以依需求調整:

Roslyn 專案的 .editorconfig 檔案 for Visual Studio 2022

# EditorConfig is awesome: https://EditorConfig.org # top-most EditorConfig file root = true # Don't use tabs for indentation. [*] indent_style = space # (Please don't specify an indent_size here; that has too many unintended consequences.) spelling_exclusion_path = SpellingExclusions.dic # Code files [*.{cs,csx,vb,vbx}] indent_size = 4 insert_final_newline = true charset = utf-8-bom # XML project files [*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] indent_size = 2 # XML config files [*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}] indent_size = 2 # JSON files [*.json] indent_size = 2 # Powershell files [*.ps1] indent_size = 2 # Shell script files [*.sh] end_of_line = lf indent_size = 2 # Dotnet code style settings: [*.{cs,vb}] # Sort using and Import directives with System.* appearing first dotnet_sort_system_directives_first = true dotnet_separate_import_directive_groups = false # Avoid "this." and "Me." if not necessary dotnet_style_qualification_for_field = false:refactoring dotnet_style_qualification_for_property = false:refactoring dotnet_style_qualification_for_method = false:refactoring dotnet_style_qualification_for_event = false:refactoring # Use language keywords instead of framework type names for type references dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion dotnet_style_predefined_type_for_member_access = true:suggestion # Suggest more modern language features when available dotnet_style_object_initializer = true:suggestion dotnet_style_collection_initializer = true:suggestion dotnet_style_coalesce_expression = true:suggestion dotnet_style_null_propagation = true:suggestion dotnet_style_explicit_tuple_names = true:suggestion # Whitespace options dotnet_style_allow_multiple_blank_lines_experimental = false # Non-private static fields are PascalCase dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.severity = suggestion dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.symbols = non_private_static_fields dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.style = non_private_static_field_style dotnet_naming_symbols.non_private_static_fields.applicable_kinds = field dotnet_naming_symbols.non_private_static_fields.applicable_accessibilities = public, protected, internal, protected_internal, private_protected dotnet_naming_symbols.non_private_static_fields.required_modifiers = static dotnet_naming_style.non_private_static_field_style.capitalization = pascal_case # Non-private readonly fields are PascalCase dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.severity = suggestion dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.symbols = non_private_readonly_fields dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.style = non_private_readonly_field_style dotnet_naming_symbols.non_private_readonly_fields.applicable_kinds = field dotnet_naming_symbols.non_private_readonly_fields.applicable_accessibilities = public, protected, internal, protected_internal, private_protected dotnet_naming_symbols.non_private_readonly_fields.required_modifiers = readonly dotnet_naming_style.non_private_readonly_field_style.capitalization = pascal_case # Constants are PascalCase dotnet_naming_rule.constants_should_be_pascal_case.severity = suggestion dotnet_naming_rule.constants_should_be_pascal_case.symbols = constants dotnet_naming_rule.constants_should_be_pascal_case.style = constant_style dotnet_naming_symbols.constants.applicable_kinds = field, local dotnet_naming_symbols.constants.required_modifiers = const dotnet_naming_style.constant_style.capitalization = pascal_case # Static fields are camelCase and start with s_ dotnet_naming_rule.static_fields_should_be_camel_case.severity = suggestion dotnet_naming_rule.static_fields_should_be_camel_case.symbols = static_fields dotnet_naming_rule.static_fields_should_be_camel_case.style = static_field_style dotnet_naming_symbols.static_fields.applicable_kinds = field dotnet_naming_symbols.static_fields.required_modifiers = static dotnet_naming_style.static_field_style.capitalization = camel_case dotnet_naming_style.static_field_style.required_prefix = s_ # Instance fields are camelCase and start with _ dotnet_naming_rule.instance_fields_should_be_camel_case.severity = suggestion dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style dotnet_naming_symbols.instance_fields.applicable_kinds = field dotnet_naming_style.instance_field_style.capitalization = camel_case dotnet_naming_style.instance_field_style.required_prefix = _ # Locals and parameters are camelCase dotnet_naming_rule.locals_should_be_camel_case.severity = suggestion dotnet_naming_rule.locals_should_be_camel_case.symbols = locals_and_parameters dotnet_naming_rule.locals_should_be_camel_case.style = camel_case_style dotnet_naming_symbols.locals_and_parameters.applicable_kinds = parameter, local dotnet_naming_style.camel_case_style.capitalization = camel_case # Local functions are PascalCase dotnet_naming_rule.local_functions_should_be_pascal_case.severity = suggestion dotnet_naming_rule.local_functions_should_be_pascal_case.symbols = local_functions dotnet_naming_rule.local_functions_should_be_pascal_case.style = local_function_style dotnet_naming_symbols.local_functions.applicable_kinds = local_function dotnet_naming_style.local_function_style.capitalization = pascal_case # By default, name items with PascalCase dotnet_naming_rule.members_should_be_pascal_case.severity = suggestion dotnet_naming_rule.members_should_be_pascal_case.symbols = all_members dotnet_naming_rule.members_should_be_pascal_case.style = pascal_case_style dotnet_naming_symbols.all_members.applicable_kinds = * dotnet_naming_style.pascal_case_style.capitalization = pascal_case file_header_template = Licensed to the .NET Foundation under one or more agreements.\nThe .NET Foundation licenses this file to you under the MIT license.\nSee the LICENSE file in the project root for more information. # RS0016: Only enable if API files are present dotnet_public_api_analyzer.require_api_files = true # IDE0055: Fix formatting # Workaround for https://github.com/dotnet/roslyn/issues/70570 dotnet_diagnostic.IDE0055.severity = warning # https://github.com/dotnet/roslyn-analyzers/issues/7436 - False positives from valid GetDeclaredSymbol calls dotnet_diagnostic.RS1039.severity = none # These xUnit analyzers were disabled temporarily to let us move to the # new xUnit and get past several component governance issues. The # following issue tracks enabling them # # https://github.com/dotnet/roslyn/issues/75093 dotnet_diagnostic.xUnit1012.severity = none dotnet_diagnostic.xUnit1030.severity = none dotnet_diagnostic.xUnit1031.severity = none dotnet_diagnostic.xUnit2005.severity = none dotnet_diagnostic.xUnit2020.severity = none dotnet_diagnostic.xUnit2023.severity = none dotnet_diagnostic.xUnit2029.severity = none # CSharp code style settings: [*.cs] # Newline settings csharp_new_line_before_open_brace = all csharp_new_line_before_else = true csharp_new_line_before_catch = true csharp_new_line_before_finally = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_between_query_expression_clauses = true # Indentation preferences csharp_indent_block_contents = true csharp_indent_braces = false csharp_indent_case_contents = true csharp_indent_case_contents_when_block = true csharp_indent_switch_labels = true csharp_indent_labels = flush_left # Whitespace options csharp_style_allow_embedded_statements_on_same_line_experimental = false csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = false csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = false csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = false # Prefer "var" everywhere csharp_style_var_for_built_in_types = true:suggestion csharp_style_var_when_type_is_apparent = true:suggestion csharp_style_var_elsewhere = true:suggestion # Prefer method-like constructs to have a block body csharp_style_expression_bodied_methods = false:none csharp_style_expression_bodied_constructors = false:none csharp_style_expression_bodied_operators = false:none # Prefer property-like constructs to have an expression-body csharp_style_expression_bodied_properties = true:none csharp_style_expression_bodied_indexers = true:none csharp_style_expression_bodied_accessors = true:none # Suggest more modern language features when available csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion csharp_style_pattern_matching_over_as_with_null_check = true:suggestion csharp_style_inlined_variable_declaration = true:suggestion csharp_style_throw_expression = true:suggestion csharp_style_conditional_delegate_call = true:suggestion csharp_style_prefer_extended_property_pattern = true:suggestion # Space preferences csharp_space_after_cast = false csharp_space_after_colon_in_inheritance_clause = true csharp_space_after_comma = true csharp_space_after_dot = false csharp_space_after_keywords_in_control_flow_statements = true csharp_space_after_semicolon_in_for_statement = true csharp_space_around_binary_operators = before_and_after csharp_space_around_declaration_statements = do_not_ignore csharp_space_before_colon_in_inheritance_clause = true csharp_space_before_comma = false csharp_space_before_dot = false csharp_space_before_open_square_brackets = false csharp_space_before_semicolon_in_for_statement = false csharp_space_between_empty_square_brackets = false csharp_space_between_method_call_empty_parameter_list_parentheses = false csharp_space_between_method_call_name_and_opening_parenthesis = false csharp_space_between_method_call_parameter_list_parentheses = false csharp_space_between_method_declaration_empty_parameter_list_parentheses = false csharp_space_between_method_declaration_name_and_open_parenthesis = false csharp_space_between_method_declaration_parameter_list_parentheses = false csharp_space_between_parentheses = false csharp_space_between_square_brackets = false # Blocks are allowed csharp_prefer_braces = true:silent csharp_preserve_single_line_blocks = true csharp_preserve_single_line_statements = true # IDE0060: Remove unused parameter dotnet_diagnostic.IDE0060.severity = warning [src/{Compilers,ExpressionEvaluator,Scripting}/**Test**/*.{cs,vb}] # IDE0060: Remove unused parameter dotnet_diagnostic.IDE0060.severity = none [src/{Analyzers,CodeStyle,Features,Workspaces,EditorFeatures,VisualStudio}/**/*.{cs,vb}] # IDE0011: Add braces csharp_prefer_braces = when_multiline:warning # NOTE: We need the below severity entry for Add Braces due to https://github.com/dotnet/roslyn/issues/44201 dotnet_diagnostic.IDE0011.severity = warning # IDE0040: Add accessibility modifiers dotnet_diagnostic.IDE0040.severity = warning # IDE0052: Remove unread private member dotnet_diagnostic.IDE0052.severity = warning # IDE0059: Unnecessary assignment to a value dotnet_diagnostic.IDE0059.severity = warning # CA1012: Abstract types should not have public constructors dotnet_diagnostic.CA1012.severity = warning # CA1822: Make member static dotnet_diagnostic.CA1822.severity = warning # Prefer "var" everywhere dotnet_diagnostic.IDE0007.severity = warning csharp_style_var_for_built_in_types = true:warning csharp_style_var_when_type_is_apparent = true:warning csharp_style_var_elsewhere = true:warning # csharp_style_allow_embedded_statements_on_same_line_experimental dotnet_diagnostic.IDE2001.severity = warning # csharp_style_allow_blank_lines_between_consecutive_braces_experimental dotnet_diagnostic.IDE2002.severity = warning # csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental dotnet_diagnostic.IDE2004.severity = warning # csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental dotnet_diagnostic.IDE2005.severity = warning # csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental dotnet_diagnostic.IDE2006.severity = warning [src/{VisualStudio}/**/*.{cs,vb}] # CA1822: Make member static # There is a risk of accidentally breaking an internal API that partners rely on though IVT. dotnet_code_quality.CA1822.api_surface = private [**/{ExternalAccess}/**/*.{cs,vb}] # RS0016: Only enable if API files are present dotnet_public_api_analyzer.require_api_files = true dotnet_diagnostic.RS0051.severity = error dotnet_diagnostic.RS0052.severity = error dotnet_diagnostic.RS0053.severity = error dotnet_diagnostic.RS0054.severity = error dotnet_diagnostic.RS0055.severity = error dotnet_diagnostic.RS0056.severity = error dotnet_diagnostic.RS0057.severity = error dotnet_diagnostic.RS0058.severity = error dotnet_diagnostic.RS0059.severity = error dotnet_diagnostic.RS0060.severity = error dotnet_diagnostic.RS0061.severity = error

這個配置檔案將會自動為 .cs、.json、.yml 和 .md 等文件類型設定編碼風格。

你可以根據專案需求進行調整,例如將 indent_size 改為 2 或使用 Tab 縮排。

參照

Last modified: 08 November 2024